10

intテンプレートに渡された変数の型を判別し、それがor かどうかに基づいて関数を呼び出す方法はありstd::stringますか?

例えば

template <class T>
struct Jam
{
     Jam(T *var)
     {
         if (typeid(var) == typeid(std::string*)
                *var = "Hello!";
         else if (typeid(var) == typeid(int*)
                *var = 25;
     }
};

そのコードを使用しようとすると、エラーが発生しますinvalid conversion from const char* to int。これは、コンパイラがテンプレートを個別の関数に「展開」し、構造の新しいインスタンスを指定したときにthrow Jam<std::string>(&setme);、ステートメントを検出var* = 25してコンパイルを拒否したためだと思われます。

これを行う適切な方法はありますか?たぶんマクロガード付き?ありがとう。

4

2 に答える 2

12

代わりに、通常の関数のオーバーロードを使用してください。

template <class T>
struct Jam
{
    Jam(std::string* var)
    {
        *var = "Hello!";
    }

    Jam(int* var)
    {
        *var = 25;
    }
};

Tインスタンス化に使用される型に特化したい場合を除きますJam。その場合、次のようにします。

template<>
struct Jam<std::string>
{
    Jam(std::string* var)
    {
        *var = "Hello!";
    }
};

template<>
struct Jam<int>
{
    Jam(int* var)
    {
        *var = 25;
    }
};


template<typename T>
struct Jam
{
    Jam(T* var)
    {
        // every other type
    }
};
于 2012-06-13T18:42:29.847 に答える
6

「部分テンプレートの特殊化」を検索します。

Jam()の本体をJam{}から取り出します。

template <class T>
struct Jam
{
  Jam(T *var);
};

次に、2つの本文を記述します。

Jam<int>::Jam(int *var) {
   // stuff
}

Jam<std::string>::Jam(std::string *var) {
   // stuff
}

(警告:さびたC ++。しかし、それは一般的にあなたがそれを行う方法です。)

新しい質問:ダックタイピングが必要な場合、なぜC ++を使用しているのですか?Rubyに切り替えて、速度が必要なプラグイン用にC++を保存します。ただし、C ++は引き続きエレガントなデザインをサポートし、さらに多くの作業を行います。

于 2012-06-13T18:46:05.303 に答える