文字列を使用してテンプレートクラスの特殊化を選択します

pzelasko

ポリシーを使用して作成されたいくつかのタイプがあります。

template <typename PolicyA, typename PolicyB>
class BaseType : PolicyA, PolicyB
{};

struct MyPolicyA {};
struct MyPolicyB {};
struct OtherPolicyB {};

using SpecializedTypeX = BaseType<MyPolicyA, MyPolicyB>;
using SpecializedTypeY = BaseType<MyPolicyA, OtherPolicyB>;

ここで、コマンドラインなどからの入力に基づいて、使用するSpecializedTypeをエレガントに選択できるメカニズムを紹介します。理想的には、次のような適切なタイプのオブジェクトを作成するファクトリメソッドになります。

auto CreateSelectedSpecializedType(const std::string &key);

// selected has type SpecializedTypeX
auto selected = CreateSelectedSpecializedType("SpecializedTypeX");  

アドバイスをいただければ幸いです。ありがとう!

jotik

型はコンパイル時に静的に固定されるため、C ++型をランタイムデータに依存させることは不可能です。したがって、関数の戻り値の型を入力引数の値に依存させることは不可能です。したがって、おそらくあなたができる最善のことは、すべてのポリシーに共通の基本クラスを作成することです。

struct CommonBase {};
template <typename PolicyA, typename PolicyB>
class BaseType : CommonBase, PolicyA, PolicyB {};

struct MyPolicyA {};
struct MyPolicyB {};
struct OtherPolicyB {};

using SpecializedTypeX = BaseType<MyPolicyA, MyPolicyB>;
using SpecializedTypeY = BaseType<MyPolicyA, OtherPolicyB>;

CommonBase * createObjectOfType(std::string const & type) {
    if (type == "SpecializedTypeX")
        return new SpecializedTypeX();
    if (type == "SpecializedTypeY")
        return new SpecializedTypeY();
    // etc...
    return nullptr;
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

別のクラスをクラステンプレートの特殊化として使用する方法

分類Dev

コンパイラが無効なテンプレートの特殊化を選択して失敗する

分類Dev

型特性を使用して文字列イテレータのテンプレート関数を特殊化する

分類Dev

std :: hash用の基本クラスの部分テンプレート特殊化を使用してオブジェクトをハッシュします

分類Dev

派生テンプレートクラスの基本クラスからメソッドを特殊化します

分類Dev

派生クラスのメンバー関数ポインターをパラメーターとして渡すときに、C ++の誤ったテンプレートの特殊化が選択されました

分類Dev

最終指定子を使用してC ++クラステンプレートを特殊化する

分類Dev

テンプレートを使用したクラステンプレートの特殊化

分類Dev

クラステンプレートを使用した可変個引数テンプレートの特殊化

分類Dev

クラスがテンプレートの特殊化であるかどうかを確認します

分類Dev

クラスがテンプレートの特殊化であるかどうかを確認しますか?

分類Dev

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

分類Dev

クラステンプレートの列挙(タイプ)メンバーを特殊化できますか?

分類Dev

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

分類Dev

std :: stringを使用したリテラルクラスは、テンプレートの特殊化でのみ機能しますか?

分類Dev

パラメータパックを使用したテンプレートクラスの特殊化

分類Dev

テンプレートテンプレートパラメータを使用して基本クラスを特殊化する

分類Dev

テンプレートを使用したコンストラクターの特殊化

分類Dev

テンプレートの特殊化を無視し、非特殊化されたテンプレートを明示的に使用します(std :: vector <bool>)

分類Dev

void_tを使用した複数のSFINAEクラステンプレートの特殊化

分類Dev

std :: enable_ifと具象型を使用したテンプレートクラスの特殊化

分類Dev

テンプレートテンプレートパラメータを使用したクラステンプレートの特殊化

分類Dev

typedefを使用したテンプレートの特殊化

分類Dev

=を使用したテンプレート演算子の特殊化

分類Dev

演算子を使用してテンプレートを特殊化する方法は?

分類Dev

1つのクラスのメンバーtypedefをテンプレート特殊化定義のテンプレートパラメーターとして使用することはできません

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

文字列型関数、呼び出しを均一にするためのテンプレートの特殊化

Related 関連記事

  1. 1

    別のクラスをクラステンプレートの特殊化として使用する方法

  2. 2

    コンパイラが無効なテンプレートの特殊化を選択して失敗する

  3. 3

    型特性を使用して文字列イテレータのテンプレート関数を特殊化する

  4. 4

    std :: hash用の基本クラスの部分テンプレート特殊化を使用してオブジェクトをハッシュします

  5. 5

    派生テンプレートクラスの基本クラスからメソッドを特殊化します

  6. 6

    派生クラスのメンバー関数ポインターをパラメーターとして渡すときに、C ++の誤ったテンプレートの特殊化が選択されました

  7. 7

    最終指定子を使用してC ++クラステンプレートを特殊化する

  8. 8

    テンプレートを使用したクラステンプレートの特殊化

  9. 9

    クラステンプレートを使用した可変個引数テンプレートの特殊化

  10. 10

    クラスがテンプレートの特殊化であるかどうかを確認します

  11. 11

    クラスがテンプレートの特殊化であるかどうかを確認しますか?

  12. 12

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

  13. 13

    クラステンプレートの列挙(タイプ)メンバーを特殊化できますか?

  14. 14

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

  15. 15

    std :: stringを使用したリテラルクラスは、テンプレートの特殊化でのみ機能しますか?

  16. 16

    パラメータパックを使用したテンプレートクラスの特殊化

  17. 17

    テンプレートテンプレートパラメータを使用して基本クラスを特殊化する

  18. 18

    テンプレートを使用したコンストラクターの特殊化

  19. 19

    テンプレートの特殊化を無視し、非特殊化されたテンプレートを明示的に使用します(std :: vector <bool>)

  20. 20

    void_tを使用した複数のSFINAEクラステンプレートの特殊化

  21. 21

    std :: enable_ifと具象型を使用したテンプレートクラスの特殊化

  22. 22

    テンプレートテンプレートパラメータを使用したクラステンプレートの特殊化

  23. 23

    typedefを使用したテンプレートの特殊化

  24. 24

    =を使用したテンプレート演算子の特殊化

  25. 25

    演算子を使用してテンプレートを特殊化する方法は?

  26. 26

    1つのクラスのメンバーtypedefをテンプレート特殊化定義のテンプレートパラメーターとして使用することはできません

  27. 27

    C ++テンプレートの特殊化に基本クラスを追加する

  28. 28

    C ++テンプレートの特殊化に基本クラスを追加する

  29. 29

    文字列型関数、呼び出しを均一にするためのテンプレートの特殊化

ホットタグ

アーカイブ