如何模板化C++构造函数以实现完美转发

bar*_*ney 3 c++ templates perfect-forwarding

我知道如何创建一个全局函数,使用可变参数模板将参数转发给类ctor(类似于shared_ptr模板类的make_shared <>):

template<typename T, typename... Args>
T Create (Args&&... args)
{
  return T(args...);  // RVO takes place here
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用类似的方法为类中的静态工厂方法创建模板?我想使用类似的可变参数模板语法将所有参数组合转发给所有可能的构造函数(我不想重载或显式地将所有可能的ctors链接到静态方法,只是使用模板和编译器来完成这项工作),即在伪代码中( !)

class Class {
public: 
static Class create(Args&&... args) 
{
     Class(args...);
}
Class(int) {} // ctor 1
Class(int, float) {} // ctor 2 
//... etc
Run Code Online (Sandbox Code Playgroud)

有类似的参数转发

如果我直接使用variadic模板,它看起来像这样

template <typename... Args>
class Class {
public:
    static Class create(Args&&... args)
    {
        return Class(args...);
    }
    Class(int) {} // ctor 1
    Class(int, float) {} // ctor 2
};
Run Code Online (Sandbox Code Playgroud)

但它提供了丑陋的使用语法,我需要明确地为模板提供类型...

int main()
{
    Class<int,float> a = Class<int,float>::create(1,2);
}
Run Code Online (Sandbox Code Playgroud)

可以这样吗?

Class a = Class::create(1,2);
Run Code Online (Sandbox Code Playgroud)

Tar*_*ama 7

只需将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
};
Run Code Online (Sandbox Code Playgroud)

Live Demo