2017-01-25 1 views
2

私は例えば、人間が読める文字列型にいくつかのunsigned char型マシンの値をマッピングするためのstd ::マップを使用しています:キーがない場合に返されるものを定義できるstd :: mapを持つ最良の方法は?

std::map<unsigned char, std::string> DEVICE_TYPES = { 
    { 0x00, "Validator" }, 
    { 0x03, "SMART Hopper" }, 
    { 0x06, "SMART Payout" }, 
    { 0x07, "NV11" }, 
}; 

は、私はこれを変更したいのですが、その渡されたキーが存在しない場合、マップは「不明」を返します。呼び出し元インターフェースを同じ状態にしたい(つまり、[]演算子を使用してマップから文字列を取得するだけです)。これを行う最善の方法は何ですか?私はWindows 7でC++ 11を利用できます。

+3

ラッパーを作成し、 '' '' [] '' ''演算子を実装。 – mascoj

+0

良い提案。しかし、私は例のようにリストの初期化子を使用してコンストラクタがどのように見えるか分かりません。その上の任意のアイデア? – SeanLabs

答えて

7

オペレータは[]が必要な動作を提供するためにオーバーロードしてあなたは、いくつかのラッパーを作成することができます:

class Wrapper { 
public: 
    using MapType = std::map<unsigned char, std::string>; 

    Wrapper(std::initializer_list<MapType::value_type> init_list) 
     : device_types(init_list) 
    {} 

    const std::string operator[](MapType::key_type key) const { 
     const auto it = device_types.find(key); 
     return (it == std::cend(device_types)) ? "Unknown" : it->second; 
    } 

private: 
    const MapType device_types; 
}; 

wandbox example

+0

ありがとう、理想的です。 – SeanLabs

関連する問題