当前位置: 华文星空 > 知识

Concept 对 C++ 有什么影响,它和 Rust 的泛型 Bound 和 Trait 有点类似?

2015-07-29知识

在C++11移除Concept的时候,Michael Wong曾经说过一句话:"I am sure this will not be the last we will hear of it." 而在C++17加入Concept的时候,Eric Niebler发了这么一条Twitter

对于C++的Concept来说,其核心观点就在于对模板参数进行约束,抽象出来了一个Concept赋予模板参数进行约束(而我更认为是有了一层"类型系统"),例子可以参见我这里的一个回答

电脑发展史上有哪些伟大的思想和技术? - 蓝色的回答

,而有了这层「类型系统」以后,你就可以如普通的类型一样,进行类型重载,如

vector < int > v { ... }; multiset < int > s { ... }; auto vi = find ( v , 7 ); // calls sequence overload auto si = find ( s , 7 ); // calls associative container overload


而非再考虑使用SFINAE。

有了这一层「类型系统」,也可以有效的改善错误提示信息,因为现在的模板参数有了「类型」了,而不是再一层一层的向下转换,直到int, char等具体类型才停下来。而模板如今的痛苦早在Bjarne书写【C++语言的设计与演化】的时候就意识到了,然而很遗憾的是,正式开始想办法解决这个问题是直到2000年才开始,而更遗憾的是C++11把这个给毙掉了。所幸在Andrew Sutton, Bjarne, STL之父Alex,印第安纳大学若干爱好者等人的努力下,重新设计Concept,最终在C++17进入。

对于Concept来说,很容易与Java, C#的interface比较,然而它们是不同的,因为Concept与Concept之间没有interface那样的继承关系。

而有了Concept以后,STL也将会使用Concept重写,所以即使你不直接使用Concept,你也能享受到Concept的好处。

而有关Concept的讨论,我在几个月前在Reddit上看到了一个非常好的讨论,在这里面包括了Concept的提案与GCC Concept的实现者Andrew Sutton的一些讨论与回复,可以参考一下:

Eric Niebler on Twitter: "The Concepts TS was voted out today! Concepts are (almost) an ISO standard. Congrats, A. Sutton. This will change everything. @isocpp #cpp" : cpp