выберите специализацию класса шаблона, используя строку

У меня есть несколько типов, созданных с использованием политик, т.е.

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

Буду признателен за любой совет. Спасибо!

3

Решение

Невозможно иметь тип 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;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]