首先,我知道我可以使用模板化的类/函子,但这不是我想要的。
这是lambda:
auto lambda = [] (auto var) {
decltype(var) x;
//do stuff with x but nothing with var
};
问题是我收到警告C4100(未参考的形式参数)。我也知道我可以使用一些技巧,例如禁用警告并在lambda之后再次启用它或使用诸如UNREFERENCED_PARAMETER之类的宏,但这是作弊。
我有什么方法可以做到这一点吗?
理想的代码如下所示:
template <typename T>
auto lambda = [] () {
T x;
//do stuff with x
};
答案 0 :(得分:17)
事实上,在C ++ 14中,您可以使用您想要的语法创建“模板lambdas”,但仅限于命名空间范围:
// (1)
template <typename T>
auto l = [] () {
T x;
};
int main() {
l<int>();
}
它不是通用lambda,它是一个变量模板,但你甚至可以创建通用模板lambda:
template <typename T>
auto l = [] (auto y) {
T x = 42;
std::cout << x + y << std::endl;
};
但是有一个缺点:似乎在当前的编译器中只有Clang支持这一点。
更新:由于这只能在命名空间范围内完成,如果你的lambda没有参数,或者没有auto
个参数(也就是说,它不是通用的),那么可以用函数代替,甚至不需要任何C ++ 11特性,更不用说C ++ 14了。如果此类lambda已捕获,则它们只能捕获全局变量,因此相应的函数可能只使用相同的变量或其副本。感谢@JasonR指出这一点:
// effectively the same as (1)
template <typename T>
void l() {
T x;
}
答案 1 :(得分:9)
如果你真的不需要这个论点,只需将它包装在void
中:
auto lambda = [](auto var) {
(void)var; // now we used it - more or less
decltype(var) x;
/* whatever else */
};
答案 2 :(得分:6)
这不是lambdas的用途,并且没有语法可以做到(除了破坏警告)。
只需编写一个合适的功能模板即可。并非一切都必须是一个lambda。
答案 3 :(得分:6)
不要使用lambda:
template<typename T>
struct Functor
{
void operator () () { T var; ... }
}
lambda不是别的,是编译器生成的函子。
答案 4 :(得分:3)
不,泛型lambda不能没有参数,因为它没有从中推导出类型的参数。您将不得不使用后备模板化函数。