我知道如何创建一个全局函数,使用可变参数模板将参数转发给类 ctor(类似于 shared_ptr 模板类的 make_shared<>):
template<typename T, typename... Args>
T Create (Args&&... args)
{
return T(args...); // RVO takes place here
}
是否可以使用类似的方法在类内部为静态工厂方法创建模板?我想使用类似的可变参数模板语法将所有参数组合转发给所有可能的构造函数(我不想重载或显式地将所有可能的构造函数链接到静态方法,而只是使用模板和编译器来完成这项工作) 即在伪代码 (!)
class Class {
public:
static Class create(Args&&... args)
{
Class(args...);
}
Class(int) {} // ctor 1
Class(int, float) {} // ctor 2
//... etc
有类似的论据转发
如果我直接使用可变参数模板,它看起来像这样
template <typename... Args>
class Class {
public:
static Class create(Args&&... args)
{
return Class(args...);
}
Class(int) {} // ctor 1
Class(int, float) {} // ctor 2
};
但它给出了丑陋的用法语法,我需要在其中明确地为模板提供类型...
int main()
{
Class<int,float> a = Class<int,float>::create(1,2);
}
可以这样吗??
Class a = Class::create(1,2);
最佳答案
只需将 create
函数设为模板而不是类:
class Class {
public:
template <typename... Args>
static Class create(Args&&... args)
{
//actually do perfect forwarding
return Class(std::forward<Args>(args)...);
}
Class(int) {} // ctor 1
Class(int, float) {} // ctor 2
};
关于c++ - 如何模板化 C++ 构造函数以实现完美转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500423/