【发布时间】:2014-03-15 23:10:54
【问题描述】:
我正在尝试设计一个工厂类,它允许我使用任意数量的构造函数参数封装任何类的构造(派生自同一个基类“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(); }
};
我可以为每个参数数量添加一个模板特化,但我想学习如何“正确”地做到这一点。
【问题讨论】:
-
是的,无法将“variadric”修复为 variadic,这让我发疯了
-
基类中的
: FactoryBase(id) {}不应该是: id_(id)吗? -
FactoryBase::id_ 在所有情况下都必须初始化,并且为了强制我将它的值作为 FactoryBase 构造函数参数,同时不为 FactoryBase 提供默认构造函数,因此所有派生类的构造函数都必须提供 ID 值。
-
我的意思是,在基类中,您在初始化列表中递归地调用构造函数
FactoryBase(id)。对我来说,这看起来像是无限递归。 -
是的,你是对的。摘录不是来自原始程序,所以我在创建示例代码时犯了一个错误。现在应该修好了。