2016-12-12 15 views
3

反復処理の中でコードを複製する必要がないように、順方向反復と逆方向反復を切り替えようとしています。C++順方向反復と逆方向反復の切り替え

私は、三項演算子を使用してみましたが、それは

auto begin = reverse ? mPxSize::reverse_iterator : 
         mPxSize::iterator; 

を動作しませんでした(それはさまざまなタイプが好きではなかったことを私の理解だった)、これのベースバージョンがある場合、私は疑問に思ってイテレータは、私は次のように

??? begin; 
??? end; 

if (reverse) { 
    mPxSize::reverse_iterator begin = m_levels.rbegin(); 
    mPxSize::reverse_iterator end = m_levels.rbegin(); 
} else { 
    mPxSize::const_iterator begin = m_levels.begin(); 
    mPxSize::const_iterator end = m_levels.begin(); 
} 

for (it = begin; it != end; it++) { 

は私が???でマークされたいくつかのベースとイテレータを先行宣言することはできますうまくいくように宣言することができます。

template<typename It> 
void foo(It begin, It end) { 
    for (It it = begin; it != end; ++it) { 
    // ... 
    } 
} 

void bar(std::vector<int>& m_levels, bool reverse) { 
    if (reverse) { 
    foo(m_levels.rbegin(), m_levels.rend()); 
    } else { 
    foo(m_levels.begin(), m_levels.end()); 
    } 
} 

アイデアが移動することです:または、ここでテンプレートを使用作るための簡単な方法

+5

イテレータのタイプに反復コードをテンプレート化します。 –

+0

現在、私の関数が定義されて ダブルfooが(constが逆BOOL){...} は、私は今、何かのよう テンプレート double inner_foo(T_b begin、T_e end){ for(begin = it;!= end; it ++){...} – chrise

+0

はい、 'foo'の内部を関数テンプレート' bar'に移動します。 'foo'は適切な型の適切なイテレータ、' 'bar ''をそれぞれの場合に、順方向または逆方向に呼び出します。 –

答えて

5

はここでテンプレートを使用してそれを行うための一つの方法です(私は非常によく理解していない私は認める、)がありますそのロジックをイテレータ型でパラメータ化されたヘルパ関数に変換します。次に、順方向または逆方向のイテレータで呼び出すことができます。

関連する問題