Lambda函数作为参数传递

时间:2014-09-06 18:05:11

标签: 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; };

1 个答案:

答案 0 :(得分:2)

我怀疑你的代码中有一个type-o,或者你使用的是一个没有完全实现lambdas(或者两者都有)的gcc版本。

如果你的例子是:

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

(v - &gt; val)

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

这里棘手的部分是一些 lambdas将隐式转换为函数指针。也就是说,没有 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。