我的函数原型看起来像这样:
template <class key_type,class data_type> std::shared_ptr<data_type> remove(std::iterator<std::forward_iterator_tag,key_type> key_start,std::iterator<std::forward_iterator_tag,key_type> key_end);
但是,这限制了我特别使用forward_iterator_tag迭代器,因此尝试调用这样的函数:
remove<char,char>(std::iterator<std::random_access_iterator_tag,char>(),std::iterator<std::random_access_iterator_tag,char());
将失败,因为编译器无法转换std :: iterator< std :: random_access_iterator_tag,...>到std :: iterator< std :: forward_access_iterator_tag,...>.此外,此方法不适用于字符串迭代器,矢量迭代器或其他stl迭代器.
有人知道stl如何实现容器/字符串以接受彼此的迭代器吗?例如,这正确编译:
std::string a = "hello";std::vector<char> v(a.begin(),a.end());解决方法
template < typename Iter >voID fun_impl(Iter begin,Iter end,std::forward_iterator_tag){ // do your stuff here...}template < typename Iter >voID fun(Iter begin,Iter end){ fun_impl(begin,end,std::iterator_traits<Iter>::iterator_category());}
begin()和end()为各种容器返回的类型不是迭代器类型< category ...>但是这种(有时)的子类.在编写通用代码时,您永远不会以特定的迭代器类型为目标.相反,您使用“标记调度”来对迭代器进行分类并调用正确的实现.由于random_iterator_tag是一个forward_iterator_tag,它将自动转换为这样,以便上面的fun_impl可以正确解析任何forward_iterator或扩展.
总结以上是内存溢出为你收集整理的c – 迭代器和模板全部内容,希望文章能够帮你解决c – 迭代器和模板所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)