2017-09-26 39 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