Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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/file/3.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++17 - Fatal编程技术网

C++ 模板函数:是否有接受任何参数类型的语法,如';自动';你喜欢兰博达斯吗?

C++ 模板函数:是否有接受任何参数类型的语法,如';自动';你喜欢兰博达斯吗?,c++,c++17,C++,C++17,我正在尝试编写一个接受复杂参数的函数。假设它可以是一个类,也可以是一个类模板。函数中的代码对于所有参数都是相同的,我不需要在任何地方引用参数的类型。所以,我想写这样的东西: auto func(auto& someComplicatedClassInstance) { return someComplicatedClassInstance.someMemberFunc(); } 我不能只写模板>代码>因为如果t是模板本身,它就不工作了,自动< /Cord>函数参数不是C++中的一

我正在尝试编写一个接受复杂参数的函数。假设它可以是一个类,也可以是一个类模板。函数中的代码对于所有参数都是相同的,我不需要在任何地方引用参数的类型。所以,我想写这样的东西:

auto func(auto& someComplicatedClassInstance) {
   return someComplicatedClassInstance.someMemberFunc();
}

<>我不能只写<代码>模板>代码>因为如果t是模板本身,它就不工作了,自动< /Cord>函数参数不是C++中的一个东西。制作
func
lambda是唯一的方法吗?对于lambda启用相同的编译器功能,而不是普通函数,这似乎很奇怪。在我的具体案例中,我正在为
操作符编写一个重载,您可以使用函数模板:

template <typename T>
auto func(T&& someComplicatedClassInstance) {
   return std::forward<T>(someComplicatedClassInstance).someMemberFunc();
}
模板
自动函数(T&&D类实例){
返回std::forward(somecomplexdclassInstance).someMemberFunc();
}

在lambda参数列表中使用
auto
与使用模板参数完全相同。它只是一个简写符号(部分原因是,在C++20之前,不能用常规模板参数声明lambda)。当编译器为lambda生成函子时,
操作符()
重载会为每个
auto
参数获取一个模板参数


因此,对于非lambda函数,您必须写出长格式。

您能举一个例子,说明它在使用lambda而不使用函数模板的类模板中适用吗?@juanchopanza:我不确定您在问什么。自C++14以来,lambda的参数类型可以声明为
auto
。但这不适用于普通函数、模板或其他函数。@VioletGiraffe但函数模板一开始并不需要它。。。因为它们是函数模板。所以问题是,你认为你可以从一个lambda中获得哪些功能,而用一个普通的旧函数模板是不能的?此外,函数模板不是“普通函数”,因为它们不是函数。它们是函数模板。为什么要使用r-val引用?@George在此上下文中,它不是r-val引用。这是一个转发参考,因为函数是一个模板。很有趣,谢谢。我不明白它是如何工作的,除了传递函数参数之外,从来没有见过将
std::forward
用于其他用途。@VioletGiraffe转发引用在这里是相切的。我想知道是否应该省略它,以避免造成干扰。@VioletGiraffe要匹配
auto&
lambda参数,您应该使用
T&