模板功能:是否有语法可以接受任何参数类型,就像lambda的'auto'一样?

时间:2018-10-14 13:31:25

标签: c++ c++17

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

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

我不能只写template <typename T>,因为如果T本身是模板,它将不起作用,并且auto函数参数在C ++中不是问题。将func设为lambda是唯一的方法吗?可以为lambda启用相同的编译器功能而不是正常功能似乎很奇怪。在我的特定情况下,我正在为operator<<写一个重载,所以不能将其设为lambda。

2 个答案:

答案 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函数,您必须将其写成长格式。