2016-04-25 11 views
3

私は2つの値を持っています。私はこれらの2つの許可された組み合わせをチェックし、見つからなければデフォルトのアクションを実行したいと思います。私は何とかこれらの値の両方でスイッチ/ケースを行うことはできますか?私は複数のif/elseステートメント、またはビットマスクパターンに従う列挙型を避けたいと思っています。なぜなら、スイッチ/ケースのようにコードではあまりよくないと思うからです。 pythonを知っている人々のために複数の列挙値のスイッチ/ケース

、私は基本的にC++でこのPythonコードのためのソリューションたい:

val1 = "a" 
val2 = 2 
actions = { 
    ("a", 1): func1, 
    ("b" ,1): func2, 
    ("a" ,2): func3, 
    ("b" ,2): func4 
} 
action = actions.get((val1, val2), default_func)() 
action() 
+2

それは音 – NathanOliver

+0

だから私はかなりだけのマップと、Pythonで同じことを行いますペアと関数ポインタ? –

+1

関数ポインタとラムダを混在させることができるように 'std :: function'を使うこともできます。 – NathanOliver

答えて

5

std::map頭に浮かぶ。

より正確には、関数オブジェクトを特定の列挙型オブジェクトのペアにマップできます。ここでは一例です:あなたは `のstd :: map`または`のstd :: unordered_map`をお勧めしますよう

#include <map> 
#include <functional> 
#include <iostream> 

enum class Enum1 
{ 
    a, b, c 
}; 

enum class Enum2 
{ 
    one, two, three 
}; 

int main() 
{ 
    auto const func1 = [] { std::cout << "func1\n"; }; 
    auto const func2 = [] { std::cout << "func2\n"; }; 
    auto const func3 = [] { std::cout << "func3\n"; }; 
    auto const func4 = [] { std::cout << "func4\n"; }; 
    auto const default_func = [] { std::cout << "default\n"; }; 

    std::map<std::pair<Enum1, Enum2>, std::function<void()>> const actions = 
    { 
     {{ Enum1::a, Enum2::one }, func1 }, 
     {{ Enum1::b, Enum2::one }, func2 }, 
     {{ Enum1::a, Enum2::two }, func3 }, 
     {{ Enum1::b, Enum2::two }, func4 } 
    }; 

    auto const val1 = Enum1::a; 
    auto const val2 = Enum2::two; 

    auto const action_iter = actions.find({ val1, val2 }); 
    auto const action = action_iter != actions.end() ? action_iter->second : default_func; 
    action(); 
} 
4

を私は何とかこれらの値の両方のスイッチ/ケースを行うことができますか?

いいえ、できません。 switchは1つの値でのみ機能します。 2つの値を1つの整数値に変換できない場合は、他の方法を使用する必要があります。私が考えることができる方法のいくつかはここにあります。

  1. ステートメントを使用することができますif-elseステートメント。

    if (val1 == "a" && val2 == 1) 
    { 
        func1(); 
    } 
    else if (val1 == "b" && val2 == 1) 
    { 
        func2(); 
    } 
    else if (val1 == "a" && val2 == 2) 
    { 
        func3(); 
    } 
    else if (val1 == "b" && val2 == 2) 
    { 
        func4(); 
    } 
    
  2. またmapを使用することができます。 std::pairキーとstd::function値を持つ

    ​​662703