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

标签 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
}

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

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
};

Live Demo

关于c++ - 如何模板化 C++ 构造函数以实现完美转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500423/

相关文章:

c++ - 没有 delete() 的 new() 是未定义行为还是仅仅是内存泄漏?

c++ - pthread_cond_t 和 std::condition_variable 的区别

c++ - 如何为子函数指定模板参数?

C++ 我应该使用转发引用吗?

c++ - 为什么在访问元素之前在容器上使用 std::forward?

c++ - C++ 中的错误共享

C++ 从另一个模板函数调用模板函数

c++ - 相同的完整模板特化

c++ - 如何正确转发/包装 static_cast?

c++ - 段错误,C++,g++,