大吃一惊


不知怎么回事,突然把限制类型的Rust范型和C++的Concepts关联起来了

Rust 代码

Trait Generic

C++ 代码

Concepts


是不是看出了些什么?

  • Rust用trait Moha来限定范型,C++使用concept Moha来限定范型
  • Rust是强迫某一类型实现Moha,C++强制某一里类型实现Moha的方法({.s()} -> std::string)
  • Rust可以通过增加Moha内的方法来增加限制, C++也可以通过增加Moha内的requires的条件来增加限制
Rust 增加ha方法
trait Moha {
  fn s(&self) -> String {
    "233".to_string()
  }

  fn ha();
}

impl Moha for i32 {
  fn ha() {}
}

impl Moha for String {
  fn ha() {}
}

impl Moha for &'static str {

}

fn foo<T: Moha>(x: T) {
  println!("{}", x.s());
}

fn main() {
  foo(233);
  foo("233"); // &str
  foo("233".to_string());
}

编译输出

error[E0046]: not all trait items implemented, missing: `ha`
  --> x.rs:17:1
   |
6  |   fn ha();
   |   -------- `ha` from trait
...
17 | impl Moha for &'static str {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `ha` in implementation

error: aborting due to previous error
C++ 增加ha方法
#include <iostream>

template<typename T>
concept bool Moha = requires(T x)
{
  {x.s()} -> std::string;
  {x.ha()} -> int;
};

void foo(Moha x)
{
  std::cout << x.s() << '\n';
}

struct Bar
{
  std::string s() { return "233"; }
  int ha() { return 233; }
};

struct Foo
{
  std::string s() { return "233"; }
};

int main()
{
  Foo f;
  foo(f);
  Bar b;
  foo(b);
}

编译输出

x.cc: In function ‘int main()’:
x.cc:29:8: error: cannot call function ‘void foo(auto:1) [with auto:1 = Foo]’
   foo(f);
        ^
x.cc:10:6: note:   constraints not satisfied
 void foo(Moha x)
      ^\~\~
x.cc:4:14: note: within ‘template concept const bool Moha [with T = Foo]’
 concept bool Moha = requires(T x)
              ^\~\~\~
x.cc:4:14: note:     with ‘Foo x’
x.cc:4:14: note: the required expression ‘x.ha()’ would be ill-formed

可见,在范型类型的限制上Rust和C++的表现是一致的,唯独有一个明显的不同点是: Rust可以为内置类型添加方法(给i32添加了s()方法)。


一个2005年的concepts proposal (concepts for c++0x)

http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1758.pdf

另一个concepts lite
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3580.pdf

里面提到的where clause以及associated types与Rust中的如出一辙,再看看Rust是从2006年开始开发的,真是细思恐极啊!



转载请注明:Serenity » 大吃一惊