我目前正在尝试设计一个通用的抽象工厂,并勾勒出以下类设计:
template <typename T>
class TFactory
{
public:
template <typename A>
static T* create(A a);
template <typename A, typename B>
static T* create(A a, B b);
template <typename A, typename B, typename C>
static T* create(A a, B b, C c);
static T* destory(T* ptr);
};
然后可以使用工厂:
Factory<MyType>::create(1, "hello");
Factory<MyType>::create<short, const std::string&>(1, "hello");
有没有更好的方法来设计它?这似乎比varargs更好,但仍然让我超载10个函数。
修改
我应该补充一点,因为我将在Factory中使用自定义内存分配器。
答案 0 :(得分:1)
没有可变参数模板,你可以做的事情不多(除了预处理程序滥用,但我看不到干净利落的方法,即没有代码生成器)。
如果你打算不重新发明轮子,请看boost::make_shared
。
顺便说一句,这不是一个抽象的工厂。抽象工厂是多态类。
答案 1 :(得分:1)
你可以在Boost库中找到这种工作,比如Bind和Lambda。
Here是一个Lambda表达式列表,它包含构造函数/析构函数和new / delete。你既可以使用它们,也可以从中受到启发,自己编写。
例如,使用Lambda构造函数,您可以拥有以下内容:
template <typename T> class TFactory {
public:
template <typename A>
static T* create(A a) {
return new a(); //where a wraps a binded constructor call.
};
};
然后你将使用create函数,如下所示:
Factory<MyType>::create(boost::bind(boost::lambda::constructor<MyType>(),1,"hello"));
我相信你可以找到一种方法让它看起来更漂亮(可能是#define)。
答案 2 :(得分:1)
听起来你正在寻找的是Varardic Templates,它将作为C ++ 0x标准的一部分引入。