Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何模板化C++;完美转发的构造函数_C++_Templates_Perfect Forwarding - Fatal编程技术网

C++ 如何模板化C++;完美转发的构造函数

C++ 如何模板化C++;完美转发的构造函数,c++,templates,perfect-forwarding,C++,Templates,Perfect Forwarding,我知道如何创建一个全局函数,该函数使用可变模板将参数转发给类ctor(类似于共享的ptr模板类的make_shared): 有相似的论点 如果我直接使用变量模板,它看起来像这样 template <typename... Args> class Class { public: static Class create(Args&&... args) { return Class(args...); } Class(int)

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

有相似的论点

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

template <typename... Args>
class Class {
public:
    static Class create(Args&&... args)
    {
        return Class(args...);
    }
    Class(int) {} // ctor 1
    Class(int, float) {} // ctor 2
};
难道就这样吗

Class a=Class::create(1,2)

不,函数模板可以推断它们的参数,但是您将
Class
作为类模板编写,并且无法推断类模板的模板参数

你不能只说
Class
,而不说你指的是
Class
的哪种特殊化,你也不能创建
Class
类型的变量,因为
Class
不是一种类型,而是一个模板,即一系列可能的类型

您可以创建一个自由函数来执行此操作:

template<typename... Args>
  inline
  Class<typename std::decay<Args>::type...>
  create_Class(ARgs&&... args)
  {
    return Class<typename std::decay<Args>::type...>{ std::forward<Args>(args)... };
  }
这将创建一个
对象


但是,也许您首先不想将
作为模板?

只需将
创建
函数作为模板,而不是类:

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
};
类{
公众:
模板
静态类创建(Args&&…Args)
{
//实际上做完美的转发

返回舱(std::forward

@Quentin你的意思是为n个构造函数中的每一个提供n个静态函数吗?这难道没有打破“不要重复自己”的原则吗?如果我们能要求编译器以某种方式自动生成所有变体就好了……你的代码的哪一部分不起作用?只需添加
模板
?@barney,所以我误解了。但是为什么你不这样做呢你直接使用构造函数吗?@KerrekSB在最上面的示例中,它的全局函数Create被模板化,以便使用参数列表很好地绑定到每个可能的构造函数。但是我希望在类中有一个静态方法,以便有这样好的语法:class instance=class::Create(15,15.5f);我只想用模板写一次,但不知道怎么做(甚至可能)[OT]我现在看不到任何完美的转发哇,谢谢,真的很有效:)如此简单直观!我希望可以为单个类的方法做模板。感谢这个伟大的例子,我将研究它。所以问题是类不能(显然)做参数推断,但全局函数可以。顺便说一句,我发现为单个类方法定义模板是可能的!请参阅邻居的答案。感谢@TartanLlama的答案。不,这不是问题。所有函数模板都可以做参数推断,而不仅仅是全局函数。问题是您试图告诉我们e
Class
像一个类型,但是你把它定义为一个模板,而这个模板不是一个类型。你写了
Class
如果
Class
是一个模板,它就无效了(你指的是什么
Class
?或者
Class a
?或者其他什么?),你写了
Class::create(1,2)
这也是无效的(您试图调用的成员函数是?
Class::create(1,2)
?还是
Class::create(1,2)
?还是其他什么?),所以如果我参考全局函数模板create_Class(arg1,arg2)-它是对类型的有效引用,因此编译器从参数中推断类型。但是如果我引用类模板类而没有明确提到类型专门化-编译器只是没有足够的信息进行推断,对吗?不,不是真的。如果您指的是create_类(arg1,arg2)然后你不提任何类型。它是一个函数模板,因此编译器从调用中推断参数类型,并从参数中推断返回类型。但你没有引用任何类型,而是在调用函数。
Class
是一个类型,
create\u Class(arg1,arg2)
是一个函数调用表达式。
int main()
{
    Class<int,float> a = Class<int,float>::create(1,2);
}
Class a = Class::create(1,2);
template<typename... Args>
  inline
  Class<typename std::decay<Args>::type...>
  create_Class(ARgs&&... args)
  {
    return Class<typename std::decay<Args>::type...>{ std::forward<Args>(args)... };
  }
auto a = create_Class(1, 2);
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
};