c ++中的"通用"迭代器

nos*_*nos 13 c++ iterator stl

我有:

void add_all_msgs(std::deque<Message>::iterator &iter);
Run Code Online (Sandbox Code Playgroud)

如何使该功能"通用",所以它可以采取任何类型的输入器?只要迭代器迭代Message,我就不在乎它是否正在迭代一个deque,一个向量或其他东西. - 这在C++中是否可以直接进行?

Edo*_* A. 13

template <typename Iterator>
void add_all_messages(Iterator first, Iterator last)
Run Code Online (Sandbox Code Playgroud)

用法:

vector<message> v;
add_all_messages(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

你需要指定结束,否则你不知道何时停止!它还为您提供了仅添加容器子范围的灵活性.


aJ.*_*aJ. 7

template<class InputIterator>
void add_all_msgs(InputIterator iter);
Run Code Online (Sandbox Code Playgroud)

用法:

std::deque<Message> deq;
add_all_msgs(deq.begin());
Run Code Online (Sandbox Code Playgroud)

  • 惯例是按值而不是通过引用来获取迭代器.除此之外,迭代器通常都是"小"的,其原因(afaik)是允许调用者传递临时值,例如std :: back_inserter的返回值.C++ 0x至少有两种我能想到的方式对此有所帮助. (5认同)
  • 你也可以在C++ 98中完成它.请参阅下面的答案,或使用BOOST_STATIC_ASSERT的答案.错误消息不如您使用概念获得的错误消息,但至少它是在实例化堆栈中的错误点. (2认同)

Pao*_*tti 5

如果希望编译器检查迭代器是否实际引用了Message对象,则可以使用如下所示的技术.

template <typename InputIterator, typename ValueType>
struct AddAllMessages { };

template <typename InputIterator>
struct AddAllMessages<InputIterator, Message> {
  static void execute(const InputIterator &it) {
    // ...
  }
};

template <typename InputIterator>
void add_all_msgs(const InputIterator &it) {
  AddAllMessages<InputIterator, 
                 typename std::iterator_traits<InputIterator>::value_type>::execute(it);
}
Run Code Online (Sandbox Code Playgroud)