c++ - Lambda 函数作为参数传递

标签 c++ c++11 lambda

我有以下功能:

template <typename Range>
Range FindFirstIf(Range rng, bool (*Function)(typename Range::ConstReference value))

对于这个函数,我尝试传递一个像这样的 lambda 函数:

rng = FindFirstIf(rng, [](const float& val) { return (v < 0.0f); });

哪里rng是浮点列表的范围,所以 Range::ConstReference定义为const float&

我的编译器(gcc)提示类型不匹配

C:\Programming\Collections\main.cpp|24|note:   mismatched types 'bool (*)(typename Range::ConstReference)' and 'main(int, char**)::< lambda(const float&) >'|

谁能告诉我我的代码有什么问题吗?

编辑:

当我传递这样的函数时,它会起作用:

bool (*func)(const float& v) = [](const float& v) { return v < 0.0f; };

当我尝试使用 auto 关键字时,问题与之前相同:

auto func = [](const float& v) { return v < 0.0f; };

最佳答案

我怀疑您的代码中存在 type-o,或者您使用的 gcc 版本未完全实现 lambda(或可能两者都实现)。

如果您的示例是:

[](const float& val) { return (val < 0.0f); }

(v -> val)

并且如果 Range::ConstReferenceconst float&,则代码是合法的 C++11。

这里棘手的部分是一些 lambda 会隐式转换为函数指针。也就是说,那些没有 lambda-capture 的 lambda 将转换为具有相同签名的函数指针。

这个:

template <class Range>
Range
FindFirstIf(Range, bool (*Function)(typename Range::ConstReference value));

struct range
{
    using ConstReference = const float&;
};

int
main()
{
    range rng;
    rng = FindFirstIf(rng, [](const float& val) { return (val < 0.0f); });
}

为我编译。

稍微研究一下在线 gcc 编译器,这似乎是 gcc 4.8 中的一个错误,已在 4.9 中修复。

关于c++ - Lambda 函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25703240/

相关文章:

c++ - 实现之间的随机输出不同

c++ - 指向结构/类的递归成员的可变指针序列作为模板参数

java - 为什么方法引用可以使用非最终变量?

c++ - 具有尾随返回类型的通用 lambda 取决于 C++11 中的可变参数

c++ - 为什么我们可以使用 SFINAE 检测 operator() 的默认参数值的存在,但不能检测自由函数和 PMF 的默认参数值?

lambda - grunt uglify 不接受 lambda 或箭头函数

c++ - 左值到右值的隐式转换

c++ - 如何使用 boost.Qi 解析此类 XML 并调用名为标签的函数?

c++ - 在 Ubuntu 上找不到 TCP_NODELAY

c# - 如何编写MIDI(乐器数字接口(interface))应用程序?