【发布时间】:2011-02-24 17:24:41
【问题描述】:
我有一个函数,其中我有一个包含字符串的容器(例如vector<string>、set<string>、list<string>),并且给定一个开始迭代器和一个结束迭代器,遍历处理字符串的迭代器范围。
目前函数是这样声明的:
template< typename ContainerIter>
void ProcessStrings(ContainerIter begin, ContainerIter end);
现在这将接受任何符合实现 operator* 的隐式接口、前缀 operator++ 以及函数体中的任何其他调用的任何类型。
我真正想做的是有一个像下面这样明确限制输入量的定义(伪代码警告):
template< typename Container<string>::iterator>
void ProcessStrings(Container<string>::iterator begin, Container<string>::iterator end);
这样我就可以这样使用它:
vector<string> str_vec;
list<string> str_list;
set<SomeOtherClass> so_set;
ProcessStrings(str_vec.begin(), str_vec.end()); // OK
ProcessStrings(str_list.begin(), str_list.end()); //OK
ProcessStrings(so_set.begin(), so_set.end()); // Error
本质上,我要做的是限制函数规范,使函数的用户清楚它接受的内容,如果代码编译失败,他们会收到一条消息,表明他们使用了错误的参数类型,而不是在函数体中找不到 XXX 类的 XXX 函数。
【问题讨论】:
-
您希望将其限制为
std::string或任何std::basic_string类型吗? -
啊,确实有人需要 概念!不幸的是,去年夏天,在 C++ 标准化委员会一位相当重要的成员的推荐下,他们被抛弃了,因为他们推迟了 C++0x 的到来,以至于“x”变成了十六进制数字。
-
为什么需要限制可以调用模板的内容?模板的重点是能够重用构造良好的算法。
-
@jmucchiello:通常的动机是更明确地说明您的限制,并为不符合它们的类型获得更好的错误消息。
-
是的,我乍一看并没有理解,但问题的目标并不是真正的限制,而是一个不跨越 7/8 行并让用户感到困惑的错误消息。概念是解决它的最佳方法......不幸的是,Boost.Concept 文档确实缺乏:/ 使用 BOOST_MPL_ASSERT_MSG 应该提供足够好的错误消息(至少比正常错误更好),但它比必要的限制更多:)