优雅的方式将初始化程序移动到for循环中的条件

Sco*_*ott 0 c++

我在随机访问迭代器上有一个循环.典型的用法是end()是过去的,不应该被解除引用,所以我需要在开始初始化东西之前执行条件.这是我的具体代码:

template <typename RAI>
void foo(RAI begin, RAI end) {
  typedef typename std::iterator_traits<RAI>::value_type VT;

  SOME_TYPE<VT> key = SOME_TYPE<VT>(*begin);

  while (begin != end) {
    do_stuff(key);
    do_more_stuff(key);
    key = SOME_TYPE<VT>(*++begin)
  }
}
Run Code Online (Sandbox Code Playgroud)

如果在函数被调用时begin == end,那么我最终取消引用end,这是我可能不拥有的内存空间.我不能宣布SOME_TYPE<VT> key;如果任一SOME_TYPEVT没有空的构造函数.我可以if...then在开始时放一个,但这看起来很......丑陋.有没有更好的办法?

Gal*_*lik 5

你能不能这样做吗?

template <typename RAI>
void foo(RAI begin, RAI end) {
  typedef typename std::iterator_traits<RAI>::value_type VT;

  for (; begin != end; ++begin) {
    SOME_TYPE<VT> key = SOME_TYPE<VT>(*begin);
    do_stuff(key);
    do_more_stuff(key);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @Scott在循环内声明是好的. (2认同)