繁体   English   中英

如何在STL算法上接收字符串的迭代器

[英]How to receive an iterator of strings on STL algorithm

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

当然我想传递一个“抽象”迭代器来将该列表的内部表示(向量,链表,映射......)与我的函数访问它分离。

这是我的方法:

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_ASSERTstd::is_same而不是boost::is_same

您可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM