我需要为接收“字符串列表”的库开发一种算法。
当然,我想传递一个“抽象”迭代器,以使该列表的内部表示( vector ,链接列表, map ...)与从我的函数对其的访问脱钩。
这是我的方法:
template <typename ForwardIterator>
void myAlgorithm(ForwardIterator itBegin, ForwardIterator itEnd) {
for(; itBegin != itEnd ; ++itBegin) {
// Do something with *itBegin
}
}
我的问题是,如何限制容器的类型为字符串?甚至更多,是否有某种方法可以将std::strings和char *都接受为元素?
非常感谢。
最佳答案
与std::iterator_traits<>
一起使用静态断言:
template<typename ForwardIterator>
void myAlgorithm(ForwardIterator itBegin, ForwardIterator itEnd) {
typedef typename std::iterator_traits<ForwardIterator>::value_type value_t;
BOOST_STATIC_ASSERT((
boost::is_same<value_t, std::string>::value ||
boost::is_same<value_t, char const*>::value
));
for(; itBegin != itEnd ; ++itBegin) {
// Do something with *itBegin
}
}
如果您使用的是C++ 0x编译器,则可以使用
static_assert
代替 BOOST_STATIC_ASSERT
和std::is_same
代替 boost::is_same
。