概念(即最近从C++ 0x标准中删除的那些)与Java等语言中的接口有何不同?
我想知道为什么STL不会重载它们的算法函数,这样我就可以通过简单地提供一个容器而不是采用更冗长的方式来传递begin + end迭代器来调用它们.我当然理解为什么我们也想使用迭代器对来处理容器/数组的子序列,但是,几乎所有对这些方法的调用都使用整个容器:
std::for_each(myVector.begin(), myVector.end(), doSomething);
Run Code Online (Sandbox Code Playgroud)
我发现它只是更方便,可读和可维护
std::for_each(myVector, doSomething);
Run Code Online (Sandbox Code Playgroud)
有没有理由STL不提供这些重载?[编辑:我的意思并不是要取代这个接口的限制之一,但要还提供了基于容器的iterface!]难道他们介绍歧义?我在考虑这样的事情:
template<typename _Container, typename _Funct>
inline _Funct for_each(_Container c, _Funct f) {
return for_each(begin(c), end(c), f);
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
(序言:我是C++ 0x游戏的后续追随者,最近有关从C++ 0x标准中删除概念的争议促使我更多地了解它们.虽然我明白我的所有问题都是完全的假设 - 只要概念在未来一段时间内不是有效的C++代码,如果有的话 - 我仍然有兴趣更多地了解概念,特别是考虑到它将如何帮助我更充分地理解最近的决定背后的优点和随之而来的争议)
在阅读了一些关于概念的介绍性材料之后,就像C++ 0x(直到最近)提出它们一样,我在思考一些语法问题时遇到了麻烦.不用多说,这是我的问题:
1)支持特定派生概念的类型(隐式地,通过auto关键字,还是显式地通过concept_maps)是否也需要独立支持基本概念?换句话说,从另一个(例如concept B<typename T> : A<T>)派生概念的行为是否隐含地包含'隐形'需求声明(在B中requires A<T>;)?混淆源于维基百科关于概念的页面,其中指出:
与类继承一样,满足派生概念要求的类型也满足基本概念的要求.
这似乎说一种类型只需要满足派生概念的要求,而不一定是基本概念的要求,这对我来说没有意义.我知道维基百科远非一个明确的来源; 以上描述只是一个不好的选择?
2)列出类型名称的概念可以是"自动"吗?如果是这样,编译器将如何自动映射这些类型名称?如果没有,是否有任何其他场合在概念上使用'auto'无效?
为澄清,请考虑以下假设代码:
template<typename Type>
class Dummy {};
class Dummy2 { public: typedef int Type; };
auto concept SomeType<typename T>
{
typename Type;
}
template<typename T> requires SomeType<T>
void function(T t)
{}
int main()
{
function(Dummy<int>()); //would this match SomeType?
function(Dummy2()); //how about this?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这些类中的任何一个都会匹配SomeType吗?或者是涉及类型名称的概念所必需的concept_map?
3)最后,我很难理解允许定义哪些公理.例如,我是否可以定义一个逻辑上不一致的公理,例如
concept SomeConcept<typename T>
{
T operator*(T&, int);
axiom …Run Code Online (Sandbox Code Playgroud)