我正在尝试设计一个工厂类,它允许我使用任意数量的构造函数参数封装任何类的构造(已经从相同的基类“Base”派生)。当前设计仅支持一个或零构造函数参数:
class FactoryBase
{
public:
FactoryBase(std::string id) : id_(id) {}
virtual ~FactoryBase(){}
virtual Base* create() const = 0;
std::string getId() const { return id_; }
protected:
std::string id_;
};
template<class T, typename A> //One argument
class Factory : public FactoryBase
{
public:
Factory(std::string id, A arg) : FactoryBase(id), arg_(arg) {}
Base* create() const { return new T(arg_); }
private:
A arg_;
};
template<class T> //zero arguments/default ctor
class Factory<T,void> : public FactoryBase
{
public:
Factory(std::string id) : FactoryBase(id) {}
Base* create() const { return new T(); }
};
我可以为每个参数添加一个模板专门化,但我想学习如何“通常”。
答案 0 :(得分:0)
根据我在duplicate中提供的信息,您需要将参数类型存储在类型列表中。在C ++ 11中,这将是std::tuple
。您的类模板应该带有一个参数包,这些参数包放在这个元组中。
构造函数应该是一个模板构造函数,它接受一个参数包,然后转发给元组数据成员的构造函数。
编译时整数序列生成器可用于访问create()
内元组的每个元素(请参阅副本中的确切代码)。