2016-03-07 68 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