gpt4 book ai didi

c++ - 传递 C++ Lambda 函数

转载 作者:IT老高 更新时间:2023-10-28 12:42:47 26 4
gpt4 key购买 nike

我一直在到处寻找这个,我似乎无法找到一个直接的答案。一些消息来源说这是不可能的,但这只会对我提出更多问题,我将在下面进一步解释。

所以情况就是这样。假设我有一个自定义容器类,其选择功能如下所示(这只是一个示例):

template <typename T>
class Container {
public:
// ...

Container<T> select(bool (*condition)(const T&)) const;

// ...
};

如您所见,select function 接受一个指向 condition 函数的指针。这是一个定义应该选择哪些项目的函数。因此,使用它的示例类似于:

bool zero_selector(const int& element) {
return (element == 0); // Selects all elements that are zero
}

现在,如果我有一个装满的容器,比如说 s = { 1, 1, 0, 0, 1, 0, 1, 0 } ,我可以选择其中只包含零的子集:

t = s.select(&zero_selector); // t = { 0, 0, 0, 0 }

如您所见,这有点笨拙。 Lambda 函数会使这更加优雅,所以我可以使用(我不确定这是否是正确的语法),例如:

t = s.select([&] (int x) -> bool { return (x == 0); });

我的问题是,这可能吗?如果是这样,我的函数原型(prototype)应该是什么 Container::select()接受一个 lambda 作为其参数之一?

如果不可能,那么 std::for_each 之类的东西怎么样?实现了可以使用 lambda 表达式作为其参数之一?任何能清楚解释这一点的资源将不胜感激。我发现的所有内容都只是给出了 lambda 函数和使用 std::function<> 的示例将它们作为参数传递,但没有任何解释 std::for_each适用于 lambda 函数。

我想指出,此代码未按原样编译/测试。它仅用于演示目的。我已经尝试在实际项目中实现相同的原则,但它不起作用。

最佳答案

无需添加下意识的 [&]-capture。你的 lambda 不需要它:

[] (int x) -> bool { return (x == 0); }

无捕获的 lambda 可以转换为相应的函数指针,所以这应该是开箱即用的。

也就是说,您可能应该声明选择函数以接受 std::function所有 lambdas 都可以转换,无论是否捕获:

Container<T> select(std::function<bool(const T&)> predicate) const;

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

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