泛型lambda可以没有参数吗?

Nig*_*een 18 c++ lambda c++14

首先,我知道我可以使用模板化的类/函子,但这不是我想要的.

这是lambda:

auto lambda = [] (auto var) {
    decltype(var) x;

    //do stuff with x but nothing with var
};
Run Code Online (Sandbox Code Playgroud)

问题是我收到警告C4100(未参考的形式参数).我也知道我可以使用一些技巧,例如禁用警告并在lambda之后再次启用它或使用诸如UNREFERENCED_PARAMETER之类的宏,但这是作弊.

有什么方法可以实现吗?

理想的代码如下所示:

template <typename T>
auto lambda = [] () {
    T x;

    //do stuff with x
};
Run Code Online (Sandbox Code Playgroud)

Ant*_*vin 17

实际上,在C++ 14中,您可以使用您想要的语法创建"模板lambdas",但仅限于命名空间范围:

// (1)
template <typename T>
auto l = [] () {
    T x;
};

int main() {
    l<int>();
}
Run Code Online (Sandbox Code Playgroud)

它不是通用的lambda,它是一个变量模板,但你甚至可以创建通用模板lambda:

template <typename T>
auto l = [] (auto y) {
    T x = 42;
    std::cout << x + y << std::endl;
};
Run Code Online (Sandbox Code Playgroud)

演示

但是有一个缺点:似乎在目前的编译器中只有Clang支持这一点.

更新:因为这只能在命名空间范围内完成,如果你的lambda没有参数,或者没有auto参数(也就是说,它不是通用的),它可以被函数替换,甚至不需要任何C++ 11特性,不提C++ 14.如果此类lambda已捕获,则它们只能捕获全局变量,因此相应的函数可能只使用相同的变量或其副本.感谢@JasonR指出这一点:

// effectively the same as (1)
template <typename T>
void l() {
    T x;
}
Run Code Online (Sandbox Code Playgroud)

  • 同意,但我的代码可以等待2或3年才能完成. (2认同)

Bar*_*rry 10

如果你真的不需要参数,只需将其包装成void:

auto lambda = [](auto var) {
    (void)var; // now we used it - more or less
    decltype(var) x;
    /* whatever else */
};
Run Code Online (Sandbox Code Playgroud)

  • 不是一个可爱的现代解决方案,但那是因为一个不存在(除了使用正确的工具).+1 (4认同)

小智 7

不要使用lambda:

template<typename T>
struct Functor
{
   void operator () () { T var; ... }
}
Run Code Online (Sandbox Code Playgroud)

lambda不是别的,编译器生成的functor.

  • @ user2565020:没关系. (3认同)

Lig*_*ica 6

这不是lambdas的用途,并且没有语法可以做到(除了破坏警告).

只需编写一个合适的函数模板.并非一切都必须是一个lambda.