c++ - 调用模板参数的构造函数

标签 c++ templates factory-pattern

给定一个模板化工厂方法,我想根据模板参数提供的构造函数调用不同的构造函数:

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/

相关文章:

c++ - C/C++ extern "C"变量编译宏

c++ - C++ 中的 BST 插入

c++ - C++ 中的对象初始化和对象工厂

java - 工厂模式设计——澄清

c# - 试图读写 protected 内存

c++ - 删除一行后留下空行

java - 在 Android studio 中使用 Activity 模板时无法添加新的 Java 类吗?

html - 使用表格设计博客?

c++ - 如何在类里面测试类型名?

c++ - 工厂方法和循环依赖