我正在尝试编写一个接受复杂参数的函数。假设它可以是一个类,也可以是一个类模板。该函数内部的代码对于所有参数都是相同的,并且我不需要在任何地方引用该参数的类型。所以,我想写这样的东西:
auto func(auto& someComplicatedClassInstance) {
return someComplicatedClassInstance.someMemberFunc();
}
我不能只写template <typename T>
,因为如果T本身是模板,它将不起作用,并且auto
函数参数在C ++中不是问题。将func
设为lambda是唯一的方法吗?可以为lambda启用相同的编译器功能而不是正常功能似乎很奇怪。在我的特定情况下,我正在为operator<<
写一个重载,所以不能将其设为lambda。
答案 0 :(得分:6)
您可以使用功能模板:
template <typename T>
auto func(T&& someComplicatedClassInstance) {
return std::forward<T>(someComplicatedClassInstance).someMemberFunc();
}
答案 1 :(得分:2)
在lambda的参数列表中使用<img>
与使用模板参数完全相同。这只是一个简写形式(部分原因是,直到C ++ 20,否则您不能使用常规模板参数声明lambda)。当编译器为lambda生成函子时,auto
重载会为每个operator()
参数获取一个模板参数。
因此对于非lambda函数,您必须将其写成长格式。