2016-03-07 10 views
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"); 

Буду признателен за любые советы. Благодаря!

+2

Какой тип 'CreateSelectedSpecializedType' возвращает? 'BaseType ' и 'BaseType ' являются несвязанными типами. Если экземпляры 'BaseType' все унаследованы от некоторого' RootClass', вы можете вернуть 'std :: unique_ptr ' и иметь простое сопоставление от строк к функциям создания. – TartanLlama

+0

@TartanLlama Ты прав, вот что я буду делать. Благодаря! – pzelasko

ответ

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; 
} 
+1

Кроме того, я бы рекомендовал вернуть 'std :: unique_ptr', чтобы собственность была очевидна. – TartanLlama