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是模板本身,它就不工作了,
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&
。