我需要为接收“字符串列表”的库开发算法。
当然我想传递一个“抽象”迭代器来将该列表的内部表示(向量,链表,地图......)与我的函数的访问分离。
这是我的方法:
template <typename ForwardIterator>
void myAlgorithm(ForwardIterator itBegin, ForwardIterator itEnd) {
for(; itBegin != itEnd ; ++itBegin) {
// Do something with *itBegin
}
}
我的问题是,如何将容器的类型限制为字符串?或者甚至更多,是否有某种方式接受std :: strings和char *作为元素?
非常感谢。
答案 0 :(得分:5)
使用静态断言和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
。
答案 1 :(得分:3)
您可以使用std::enable_if
来限制可能的模板参数:
#include <type_traits>
#include <iterator>
template <typename ForwardIterator>
typename std::enable_if<
std::is_same<
typename std::iterator_traits<ForwardIterator>::value_type,
std::string
>::value, void
>::type
myAlgorithm(ForwardIterator itBegin, ForwardIterator itEnd) {
for(; itBegin != itEnd ; ++itBegin) {
// Do something with *itBegin
}
}
虽然我没有看到这个限制的重点。
有没有办法接受std :: strings和char *作为元素?
当然,只需将std::is_same
替换为std::is_convertible
。