具有构造函数的可变参数模板参数的工厂类

时间:2014-02-16 18:49:26

标签: c++ templates

我正在尝试设计一个工厂类,它允许我使用任意数量的构造函数参数封装任何类的构造(已经从相同的基类“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(); }
};

我可以为每个参数添加一个模板专门化,但我想学习如何“通常”。

1 个答案:

答案 0 :(得分:0)

根据我在duplicate中提供的信息,您需要将参数类型存储在类型列表中。在C ++ 11中,这将是std::tuple。您的类模板应该带有一个参数包,这些参数包放在这个元组中。

构造函数应该是一个模板构造函数,它接受一个参数包,然后转发给元组数据成员的构造函数。

编译时整数序列生成器可用于访问create()内元组的每个元素(请参阅副本中的确切代码)。