2017-05-28 7 views
1

私は2つの状態のいずれかになることができるクラスを持っています。操作を引数として取る式を実装する方法を探しています

メンバ変数m_bCondがオブジェクトの状態を決定すると仮定します。

は今、クラスのメンバ関数の多くで、私は次のコードパターンを持っている:

if (m_bCond) 
{ 
    do some operation on 'm_vector[m_index]' 
} 
else 
{ 
    for (const auto& item : m_vector) 
    { 
     do some operation on 'item' 
    } 
} 

は、私はより多くの「きれい」それを行うために使用できる任意の良い構文はありますか?

何らかの種類の式を使用して、その操作を引数として渡したいと考えています。

何かのように:

Expression(operation) 
{ 
    if (m_bCond) 
    { 
     do 'operation' on 'm_vector[m_index]' 
    } 
    else 
    { 
     for (auto item : m_vector) 
     { 
      do 'operation' on 'item' 
     } 
    } 

私は例えば、Pythonでそれを行うことは簡単だろうが、私はC++について本当によく分かりません。

私はマクロで行うことができますが、それはかなり難しいと思われるコードを私に残すでしょう。だから私は、ある種のラムダ、または可能であればメンバ関数を探していると思います。

ありがとうございます。使用

+0

['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)多分? –

+0

@start :: function'は無意味なオーバーヘッドのように聞こえます。おそらくちょうど地方のラムダですか? – lisyarus

+0

@lisyarusたとえば、 lambdaをパラメータとして使うには、 'std :: function'が必要です。 OPがパラメータとして操作を要求したので... –

答えて

3

あなたは、ラムダ/ファンクタ/機能を受け入れる汎用関数を作成し、その後、あなたはこのようにそれを使用することができますので、

template<typename Operation> 
void apply(Operation operation) 
{ 
    if (m_bCond) 
    { 
     operation(m_vector[m_index]); 
    } 
    else 
    { 
     for (auto item : m_vector) 
     { 
      operation(item); 
     } 
    } 
} 

のようなベクトルのベクトルまたは要素に適用することができるはずです(コードを短くするためのラムダ):

MyType foo; 
//populate and set foo's members 
// set condition to true 
foo.apply([](auto& v){ v.push_back(10); }); 
// set condition to false 
foo.apply([](auto& i){ i *= 42; }); 
+0

素晴らしいです。私のことを考えているように見えます。しかし、1つの小さな質問:場合によっては、操作によって項目/項目が変更され、場合によっては変更されない場合もあります。これは現在、私の 'for'ループは' auto&item'を使うことがあり、 'const auto&item'を使うことがあることを意味します。だから私は2つの異なる機能を実装する必要がありますか、またはあなたの答えの単一の機能は両方の場合のために "テンプレート化"することができますか?再度、感謝します!!! – goodvibration

+0

@goodvibration左辺参照を 'const'への左辺値の参照を期待する関数に渡すことができるので、現状どおりに動作します。 – Quentin

関連する問題