2017-09-26 37 views
0

我有一个循环遍历随机访问迭代器。典型的用法是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) 
    } 
} 

如果开始==结束的时候,函数被调用,那么我最终取消引用结束,这是我可能没有自己的内存空间。如果SOME_TYPEVT没有空构造函数,则无法声明SOME_TYPE<VT> key;。我可以在开始时输入if...then,但那看起来很......很丑陋。有没有更好的办法?

回答

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); 
    } 
} 
+0

它会抱怨多重声明吗? – Scott

+0

如果没有相关类型的空构造函数,它会在循环之前声明它。 – Scott

+0

呵呵。不知何故,我的印象是我无法在循环中声明一个变量...... TIL – Scott