我需要为接收“字符串列表”的库开发一种算法。

当然,我想传递一个“抽象”迭代器,以使该列表的内部表示( 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

07-26 06:01