给定一个模板化工厂方法,我想根据模板参数提供的构造函数调用不同的构造函数:
template<typename T>
T* Factory::create()
{
if (hasOnlyDefaultConstructor<T>())
return new T();
else
return new T(this);
}
两个问题:
- 如果 T 没有构造函数 T(Factory*),则存在编译问题。
- 如何编写hasOnlyDefaultConstructor()?
总的来说,我想要以下内容:
template<typename T>
T* Factory::create()
{
if (hasDefaultConstructor<T>())
return new T();
else if (hasUnaryConstructor<T>())
return new T(create());
else if (hasBinaryConstructor<T>())
return new T(create(), create());
else ....
}
有没有办法在 C++ 中实现这一点?我理解如果有多个构造函数供编译器选择会出现问题,但假设我们只传递只有一个公共(public)构造函数的类型 T。
class A
{
A(B* b);
}
class B
{
B(C* c, D* d);
}
A* a = Factory::create<A>(); // same as A* a = new A(new B());
B* b = Factory::create<B>(); // same as B* b = new B(new C(), new D());
难道不能编写一个通用函数 create() 来实例化 B 和 A 吗?
最佳答案
你的例子有点奇怪......
我猜你想要类似的东西:
template<typename T>
T* Factory::create()
{
return new T();
}
template<typename T, typename P0>
T* Factory::create(P0&& p0)
{
return new T(std::forward<P0>(p0));
}
template<typename T, typename P0, typename P1>
T* Factory::create(P0&& p0, P1&& p1)
{
return new T(std::forward<P0>(p0), std::forward<P1>(p1));
}
或者使用可变参数模板:
template<typename T, typename... Args>
T* Factory::create(Args&&... args)
{
return new T(std::forward<Args>(args)...);
}
编辑:
基于下面的评论......从内存管理的角度来看仍然很奇怪。
template<typename T>
struct factory;
template<>
struct factory<A>
{
static A* create(){return new A(new B());}
}
template<>
struct factory<B>
{
static B* create(){return new B(new C(), new D());}
}
int main()
{
A* a = factory<A>::create();
B* b = factory<B>::create();
return 0;
}
关于c++ - 调用模板参数的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8711542/