0

アイテムを列挙型から対応する文字列に変換する関数を作成しようとしています。私が使用する列挙型はかなり長いので、switch-caseは使いたくありませんでした。boost :: unordered_mapを使用するメソッドは非常に便利ですが、デフォルトの戻り値を作成する方法がわかりません(列挙型に一致するアイテムがない場合)。

const boost::unordered_map<enum_type, const std::string> enumToString = boost::assign::map_list_of
(data_1, "data_1")
(data_2, "data_2");

追加の関数を作成しようとしました:

std::string convert(enum_type entry)
{
    if (enumToString.find(entry))       // not sure what test to place here, 
        return enumToString.at(entry);  //because the find method returns an iter
    else
        return "invalid_value";
}

私も非常に間違ったことを試みました:

std::string convert(enum_type entry)
{
    try{
        return enumToString.at(entry);
    }
    catch(...){
        return "invalid_value";
    }
}

結果:邪悪な「デバッグ」ランタイムエラー。
1)列挙型を列挙型アイテムと同じ名前の文字列に変換する簡単な方法を
見つける2)すでに構築されているブーストメソッドを使用してハッシュマップからデフォルト値を取得する方法を見つける方法について誰かが私に提案を与えることができますか?(最良のオプション)
3)キーと値のペア、またはキーがマップに見つからない場合は別の文字列のいずれかを返す関数を使用するために、テストに何を配置するかを見つけます。
どうもありがとうございます。

4

2 に答える 2

2

変換ルーチンの場合:

std::string
convert( enum_type entry )
{
    boost::unordered_map<enum_type, std::string>::const_iterator
                        retval = enumToString.find();
    return retval == enumToString.end()
        ? "invalid_value"
        : retval->second;
}

列挙型に割り当てられた値が含まれていない場合は、単純なものでchar const* []うまくいくことに注意してください。

于 2012-04-13T17:25:52.883 に答える
0

これはあなたの質問に対する明確な答えではありませんが、別のデータ構造を使用することをお勧めします。

Boost.Bimapなどの双方向マップを使用する

Boost.Bimap は、C++ 用の双方向マップ ライブラリです。Boost.Bimap を使用すると、両方のタイプをキーとして使用できる連想コンテナーを作成できます。は、とのbimap<X,Y>組み合わせと考えることができます。std::map<X,Y>std::map<Y,X>

双方向マップ (2 つのstd::unordered_mapインスタンスを持つ基本的なマップを実装することもできます) を使用すると、次のことが可能になります。

  • の列挙子を取得しますstd::string
  • std::string列挙子の を取得します。

テンプレート クラスに取得メソッドをカプセル化すると、DRY を最小限に抑えることができます。例)std::stringインスタンスを介して列挙子/関連付けを、1 つの引数std::pairを期待するコンストラクターに渡すことができます。std::initializer_list

于 2014-07-28T09:32:08.780 に答える