gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:03 26 4
gpt4 key购买 nike

我有以下功能:

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是 float 列表的范围,所以 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 -> 值)

并且如果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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com