gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:51 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com