2

質問が 1 つあります (タイトルにもあります): C++ では、次のようなジェネリック関数を作成できますread<type>()か?

私はすでにそれを試しました:

template <typename T>
T read() {
    T res;

    if (typeid(T) == typeid(int))
    {
        // some stuff
    }
    else if (/*some other type check*/) {} // etc.
}

そして、これをコンパイルしようとすると、スローされました: Invalid conversion from **** to ****. このように例外がスローされる理由はわかっていますが、C++ でそれを行うことは可能ですか?

ありがとう

4

2 に答える 2

6

このようなことを達成できます。最も簡単な方法は、おそらく明示的な特殊化を使用することです。

template <typename T>
T read() {
    T res;

    // etc.
}

template <>
int read<int>() {
    int res;

    // your special int code
}

やりたいことによっては、代わりにタグディスパッチを使用する必要がある場合があります。

デフォルトの「unknown T」の場合に妥当な動作を思い付くことができる場合にのみ、これを行う必要があることに注意してください。定義済みの特別な値の場合にユーザーに1つだけ選択させたい場合は、T別の関数を用意し、ここではテンプレートを使用しないでください。

于 2013-08-04T22:06:51.530 に答える
2

テンプレートを使用すると、メタプログラミングを実行し、実際の型をジェネリック型 T に抽象化することも可能です。

  • テンプレートをオーバーロードして、型推論システムが「ジェネリック」バージョンではなくオーバーロードされたバージョンを選択するようにします
  • SFINAE 手法を使用して、いくつかの条件が検証されたときに特定の実装を選択します
  • アサーション
  • C++11 環境では、type_traitsを使用することも可能です

テンプレートは、使用するすべての型の特定の関数に対して同じ実装を作成することを活用するためにここにあることを思い出してください。これは、コンパイル テンプレートが関数に変換された後のコンパイル時の機能です。入力で取得した型に基づいて特定の動作を指定する必要がある場合は、SFINAE、type_traits、または他の同様のソリューションに関心があるかもしれません。

「数量」、数値をテンプレート化することもできます。たとえば、 をテンプレート化できますint

テンプレートは、関数が実行する署名のチェックのような特定の「フィルター」を型に課さないという事実に注意してください。文字通り、任意の型またはクラスをテンプレートにスローできます。これは、必要なテンプレートの 1 つの欠点です。テンプレートを使用しているほぼすべての時間を処理します。

于 2013-08-04T22:16:26.100 に答える