2011-11-15 8 views
2

私はマップを持っています。ここで、文字列は属性の名前を表し、2番目の値はこの属性が持つべきです。C++のマップタイプのタイプ

map.insert(make_pair("X", iDatatype::iUint)); 
map.insert(make_pair("Y", iDatatype::iUint)); 
map.insert(make_pair("RADIANT", iDatatype::iFloat)); 

ここで、iDatatypeはすべての可能な型の列挙です。プログラムは、例えば、それはマップを見てより「RADIANT」iDatatype値を見つける(iter->秒)を作成し、ケースを切り替えるために行くためのコマンドを取得した場合

typedef enum 
{ 
    iUnknown = 0, 
    iByte = 1, 
    iChar  = 2, 
    iUChar  = 3, 
    iShort  = 4..... 

} iDatatype; 

switch (iter->second) { 
      case iDatatype::iUint: 
      uint value = ...... 
      // You gotta do what you gonna do 
      break; 
       } ....... 

スイッチのケースでは、属性のタイプに依存する関数が呼び出されます。

このコードは機能します。しかし、文字列を型にマップするのが最良の解決策であるかどうかはわかりません。 私は何を探すべきか分からないという問題はありますか?そのような目的のために一般的に使用されている方法や技術をお勧めしますか?大いに感謝する。

答えて

3

あなたには、いくつかの他の参照用のマップを必要としない限り、別のアプローチは次のようになります。

if(command == "X" || command == "Y") // make sure command is std::string 
            // or use strcmp 
{ 
    // create uint 
} 
else if(command == "RADIANT") 
{ 
    // create float 
} 

マップはバイナリサーチしばらく使用していますので、私は、これはマップを使用するよりもなりますどれだけ速くわからないんだけど、しかし、これは反復検索を使用します。
あなたは別の列挙は必要あなたが関数のマップに使用することはできませんしながら、バイナリサーチのブーストを獲得したい場合:

std::map<std::string, std::function<void()> map; 
map.insert(make_pair("X", &create_uint)); 
map.insert(make_pair("Y", &create_uint)); 
map.insert(make_pair("RADIANT", &create_float)); 

以降のようにそれを呼び出す:あなたも渡すことができ

std::string key = "X"; 
map[key](); 

をそれには次のようなパラメータがあります:

void create_uint(std::string param) { /* ... */ } 

std::map<std::string, std::function<void(std::string)> map; 
map.insert(make_pair("X", &create_uint)); 

std::string key = "X"; 
std::string param = "XYZ"; 
map[key](param); 
+0

これからは正式なのですが、C++ 11と実装コンパイラの若い時代のために、C + + 11度f 'std :: function'が適切です。誰もがあなたが最新のgcc/VS /それを使うために何かを必要としているという事実を知っているわけではありません。もちろん、私は「C++ 11の機能を使用しない」とは言っていませんが、「そのように言及してください」とは言いません。 –

+0

@ChristianRau:ちょうどその新しいことは、ロックの下でクロールし、C++ 1234BCの機能を可能な限り使用し、常に新機能について警告する必要があるということを意味するものではありません。 – Dani

+0

いいえ、それを使うのは良い考えです。しかし、初心者がC++の標準化プロセスを知っていることを期待しないでください(あるいはOPのために保持する必要はありません)。次の質問は "私のコンパイラが' std :: function'を見つけられないのはなぜですか? –