関数テンプレートを部分的に特殊化する代わりに、どうすればよいですか?

einpoklum

私は次のように書きたいです:

template <typename S, typename T> void foo() {
    /* code for the general case */
}

template <typename T> void foo<MySType,T>() {
    /* partially specialized code - for any kind of T, but when S is MySType */
}

または、その他の場合は、次のとおりです。

template <typename S, typename T> void bar(const S& a, const T& b) {
    /* code for the general case */
}

template <typename T> void bar<MySType,T>(const MySType& a, const T& b) {
    /* partially specialized code - for any kind of T, but when S is MySType */
}

C ++(11)ではこれを実行できません。

今、私はこの質問とその答えを読みました; 部分的なテンプレートの特殊化がない理由の説明を購入したとしましょう(または、私が現実に住んでいて、実際にコードを書きたいと思っているだけです)。代わりに、私は何をますか?

それが絶対に私の最後の手段でない限り、私は実際にはこれらの関数をクラスでラップしたくありません。

チル

もう1つのオプションは、部分的な特殊化を実行できるヘルパークラステンプレートを使用し、部分的に特殊化する必要のないラッパー関数を使用して非表示にすることです。

#include <iostream>

template<typename S, typename T>
struct foo_helper {
    void foo() {
        std::cout << "general func" << std::endl;        
    }
};

struct MyType {};

template <typename T>
struct foo_helper <MyType,T> {
    void foo() {   
        std::cout << "partially specialized code - for any kind of T, but when S is MyType" << std::endl;
    }
};

template<typename S, typename T>
void foo() {
    foo_helper<S, T>().foo();
}

int main () {
    foo<int, int>();
    foo<int, double>();
    foo<MyType, long>();
}

これはC ++ 98/03でも有効です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

関数テンプレートを「部分的に特殊化」できるように調整するにはどうすればよいですか?

分類Dev

関数テンプレートの特殊化を減らすにはどうすればよいですか?

分類Dev

関数テンプレートの部分的な特殊化を回避するにはどうすればよいですか?

分類Dev

クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

分類Dev

同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

分類Dev

std :: string用にテンプレートを特殊化するにはどうすればよいですか

分類Dev

定義とは別にvoidに部分的に特殊化されたテンプレートを実装するにはどうすればよいですか?

分類Dev

既存のテンプレートクラスを新しいタイプに部分的に特殊化するにはどうすればよいですか?

分類Dev

STLコンテナであるテンプレートパラメータに基づいて、選択したメンバー関数の部分的な特殊化をシミュレートするにはどうすればよいですか?

分類Dev

クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

分類Dev

列挙値のクラステンプレートを部分的に特殊化するにはどうすればよいですか?

分類Dev

テンプレートの特殊化の代わりに関数テンプレートを使用する

分類Dev

部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

分類Dev

C ++ 11では、戻り値の型に基づいて関数オブジェクトを受け取る関数テンプレートを特殊化するにはどうすればよいですか?

分類Dev

typename引数のないテンプレートを特殊化するにはどうすればよいですか?

分類Dev

異なるタイプを返すように設計されたテンプレート関数をどのように特殊化できますか?

分類Dev

テンプレート化されていないクラスのテンプレート化されたメンバーメソッドを部分的に特殊化するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

関数型インターフェースのストレート宣言で型を特殊化するにはどうすればよいですか?

分類Dev

関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

分類Dev

それ自体がテンプレートであり、戻り型のみがテンプレート型に依存する型でテンプレートメソッドを特殊化するにはどうすればよいですか?

分類Dev

テンプレート化されたクラスの基本クラスに基づいてメンバー関数を特殊化するにはどうすればよいですか

分類Dev

type_traitsまたはテンプレート関数の特殊化を使用してテンプレートメソッドを統合するにはどうすればよいですか

分類Dev

* .cppファイルにテンプレート特殊化メソッドを実装するにはどうすればよいですか?

分類Dev

クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

分類Dev

パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

分類Dev

.cppファイルでテンプレートメンバー関数の明示的な特殊化を定義するにはどうすればよいですか?

分類Dev

インスタンス化されている場合、テンプレート化された変数の特殊化をコンパイル時に失敗させるにはどうすればよいですか?

Related 関連記事

  1. 1

    関数テンプレートを「部分的に特殊化」できるように調整するにはどうすればよいですか?

  2. 2

    関数テンプレートの特殊化を減らすにはどうすればよいですか?

  3. 3

    関数テンプレートの部分的な特殊化を回避するにはどうすればよいですか?

  4. 4

    クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

  5. 5

    同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

  6. 6

    std :: string用にテンプレートを特殊化するにはどうすればよいですか

  7. 7

    定義とは別にvoidに部分的に特殊化されたテンプレートを実装するにはどうすればよいですか?

  8. 8

    既存のテンプレートクラスを新しいタイプに部分的に特殊化するにはどうすればよいですか?

  9. 9

    STLコンテナであるテンプレートパラメータに基づいて、選択したメンバー関数の部分的な特殊化をシミュレートするにはどうすればよいですか?

  10. 10

    クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

  11. 11

    列挙値のクラステンプレートを部分的に特殊化するにはどうすればよいですか?

  12. 12

    テンプレートの特殊化の代わりに関数テンプレートを使用する

  13. 13

    部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

  14. 14

    C ++ 11では、戻り値の型に基づいて関数オブジェクトを受け取る関数テンプレートを特殊化するにはどうすればよいですか?

  15. 15

    typename引数のないテンプレートを特殊化するにはどうすればよいですか?

  16. 16

    異なるタイプを返すように設計されたテンプレート関数をどのように特殊化できますか?

  17. 17

    テンプレート化されていないクラスのテンプレート化されたメンバーメソッドを部分的に特殊化するにはどうすればよいですか?

  18. 18

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  19. 19

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  20. 20

    関数型インターフェースのストレート宣言で型を特殊化するにはどうすればよいですか?

  21. 21

    関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

  22. 22

    それ自体がテンプレートであり、戻り型のみがテンプレート型に依存する型でテンプレートメソッドを特殊化するにはどうすればよいですか?

  23. 23

    テンプレート化されたクラスの基本クラスに基づいてメンバー関数を特殊化するにはどうすればよいですか

  24. 24

    type_traitsまたはテンプレート関数の特殊化を使用してテンプレートメソッドを統合するにはどうすればよいですか

  25. 25

    * .cppファイルにテンプレート特殊化メソッドを実装するにはどうすればよいですか?

  26. 26

    クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

  27. 27

    パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

  28. 28

    .cppファイルでテンプレートメンバー関数の明示的な特殊化を定義するにはどうすればよいですか?

  29. 29

    インスタンス化されている場合、テンプレート化された変数の特殊化をコンパイル時に失敗させるにはどうすればよいですか?

ホットタグ

アーカイブ