c++ - 迭代器和模板

标签 c++ templates stl iterator

我正在尝试实现一个函数,允许用户输入某种类型的开始和结束迭代器,然后对数据执行一些操作。但是,该函数必须足够通用,它应该适用于多种类型的迭代器(例如 std::vector::iteratorstd::string::iteratorstd::iterator 等)。唯一的限制是迭代器必须至少为 forward_iterator_tag。能力。

我的函数原型(prototype)是这样的:

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,...> .此外,此方法不适用于字符串迭代器、 vector 迭代器或其他 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()对于各种容器不是类型 iterator<category...>但此类(有时)的子类。在编写通用代码时,您永远不会以特定的迭代器类型为目标。相反,您使用“标记分派(dispatch)”来对迭代器进行分类并调用正确的实现。由于 random_iterator_tag 是一个 forward_iterator_tag 它将自动转换为上面的 fun_impl。将正确解析任何 forward_iterator 或扩展。

关于c++ - 迭代器和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5075374/

相关文章:

c++ - 为什么标准库有find和find_if?

c++ - 跨平台 C++ 网络(没有大库)

c++ - Node 插件无法快照 (CreateToolhelp32Snapshot) 模块

c++ - 时区问题 : `$ date -R` says `+0300` , 但 `timezone` 表示 `-7200`

c++ - 在 C++ 中打印元组内的对

c++ - 模板方法的模板模板参数推导失败(尽管显式专门化)

java - 来自 http 调用和表单的 Meteor 动态模板

c++ - cpp迭代器问题

c++ - 调试不会在调试器内部发生的崩溃

固定大小 vector 的 C++ vector