使用迭代器执行对象操作的函数

And*_*eas 1 c++ containers templates iterator c++11

假设我有一个std::array<SomeType, N>并且我想调用一个函数,它使用迭代器来处理对象,std::array但不知道容器是什么std::array.

SomeType是一个具有公共成员函数doSomething()的类

例如,函数可能是:

template<typename Iterator>
void action(Iterator &beg, Iterator &end) {
  for (; beg != end; ++beg)
    beg->doSomething();
}
Run Code Online (Sandbox Code Playgroud)

通过以下方式调用此功能:

int main() {
  std::array<SomeType, 10> a;

  action<std::array<SomeType, 10>::iterator>(a.begin(), a.end());
}
Run Code Online (Sandbox Code Playgroud)

但我想知道这是不是这样做的?特别是因为模板可以用于每个类.有没有办法限制功能,SomeType而不让功能知道容器是一个std::array

Ker*_* SB 5

  1. 修复你的代码:你不应该要求左值参数.事实上,迭代器应该是有效复制的.

    template<typename Iterator>
    void action(Iterator beg, Iterator end)
    //          ^^^^^^^^^^^^  ^^^^^^^^^^^^
    
    Run Code Online (Sandbox Code Playgroud)
  2. 让模板参数推导完成它的工作:

    action(a.begin(), a.end());
    
    Run Code Online (Sandbox Code Playgroud)