【发布时间】:2011-07-01 19:33:35
【问题描述】:
我正在尝试实现一个功能,该功能允许用户输入某种类型的开始和结束迭代器,然后对数据执行一些操作。但是,该函数必须足够通用,它应该适用于多种类型的迭代器(例如std::vector::iterator、std::string::iterator、std::iterator 等)。唯一的限制是迭代器必须至少具有forward_iterator_tag 能力。
我的函数原型是这样的:
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());
【问题讨论】:
标签: c++ templates stl iterator