3

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

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");  

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

4

1 に答える 1

2

型はコンパイル時に静的に固定されるため、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;
}
于 2016-03-07T14:30:50.067 に答える