0

これが間違ったサイトである場合は事前にお詫びします。間違っている場合はお知らせください。

特定のキーが存在するかどうかを確認する関数を作成し、std::mapこれを使用するのが良い方法であるかどうか、そして誰もが改善への指針を投げることができるかどうか疑問に思いました。

では、値として複数のstd::mapデータ型を受け入れることができます。

union Variants {

    int asInt;
    char* asStr;


    Variants(int in) { asInt = in; }
    Variants() { asInt = 0;}
    Variants(char* in) { asStr = in; }

    operator int() { return asInt; }
    operator char*() { return asStr; }

};

template<typename T, typename Y>
bool in_map(T value, std::map<T, Y> &map)
{
     if(map.find(value) == map.end()) {
       return false;
   }else{
     return true;
   }
}

そして、メインで次のものを使用できます。

 std::map<string, Variants> attributes;

 attributes["value1"] = 101;
 attributes["value2"] = "Hello, world";

 if(in_map<std::string, Variants>("value1", attributes))
 {
    std::cout << "Yes, exists!";
 }

どんな助けやアドバイスも大歓迎です。これが規則や基準に準拠していない場合は申し訳ありません。ありがとう!

4

3 に答える 3

0

タイピング

if(in_map<std::string, Variants>("value1", attributes))

その型名構文をすべて入力するのは、私には少し過剰に思えますがmap.find、便宜上、代わりに関数を使用したくなるだけです。ただし、コンパイラによっては、テンプレート パラメーターが自動的に解釈される場合があります。たとえば、ビジュアル スタジオでは次のように解釈されます。

if(in_map(std::string("value1"), attributes))

この場合、 をstd::string置き換えるオブジェクトを作成する必要がありましたが、呼び出しからテンプレート定義を完全に削除しました。コンパイラは、指定されたパラメーターに基づいて何を理解しているかをchar*まだ把握しています。TY

#defineただし、 「関数」を定義するために使用することをお勧めします。実際には関数ではありませんが、#define実際にはコードのスニペットをソースに直接置き換えるだけなので、物事がはるかに簡単になり、視覚的に魅力的になります。

#define in_map(value,map) (map.find(value) != map.end())

次に、それを使用するコードは次のようになります。

if(in_map("value1", attributes))

関数呼び出しを使用しないという最適化と、PHP のような外観の両方が得られます。

于 2013-09-05T23:45:53.070 に答える