我一直在寻找这个,我似乎无法找到一个直接的答案.一些消息来源说这是不可能的,但这只会给我带来更多问题,我将在下面进一步解释.
所以情况就是这样.假设我有一个带有如下选择函数的自定义容器类(这只是一个例子):
template <typename T>
class Container {
public:
// ...
Container<T> select(bool (*condition)(const T&)) const;
// ...
};
Run Code Online (Sandbox Code Playgroud)
如您所见,该select
函数采用指向条件函数的指针.这是一个定义应选择哪些项目的函数.因此,使用此示例将类似于:
bool zero_selector(const int& element) {
return (element == 0); // Selects all elements that are zero
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个容器填充,比方说s = { 1, 1, 0, 0, 1, 0, 1, 0 }
,我可以选择这些只包含零的子集:
t = s.select(&zero_selector); // t = { 0, 0, 0, 0 }
Run Code Online (Sandbox Code Playgroud)
如你所见,这有点笨重.Lambda函数会使这更加优雅,所以我可以使用(我不确定这是否是正确的语法),例如:
t = s.select([&] (int x) -> bool { return (x == 0); });
Run Code Online (Sandbox Code Playgroud)
我的问题是,这可能吗?如果是这样,我的函数原型应该Container::select()
接受lambda作为其参数之一?
如果不可能,那么如何std::for_each
实现可以使用lambda表达式作为其参数之一?任何可以清楚解释这一点的资源都会非常感激.我发现的所有内容都提供了lambda函数的示例,并使用std::function<>
它们作为参数传递,但没有解释如何std::for_each
使用lambda函数.
我想请注意,此代码未按原样编译/测试.它仅用于演示目的.我尝试在实际项目中实现相同的原则,但它不起作用.
Ker*_* SB 42
没有必要添加膝盖 - 混蛋 - [&]
捕获.你的lambda不需要它:
[] (int x) -> bool { return (x == 0); }
Run Code Online (Sandbox Code Playgroud)
无捕捉的lambda可以转换为相应的函数指针,所以这应该是开箱即用的.
也就是说,您应该声明select函数接受std::function
,所有 lambda都可以转换,捕获或不捕获:
Container<T> select(std::function<bool(const T&)> predicate) const;
Run Code Online (Sandbox Code Playgroud)
MSN*_*MSN 17
您需要将lambda声明为无状态(即使用空捕获规范[](int x)-> bool {...}
),以便将其转换为函数指针.
归档时间: |
|
查看次数: |
32542 次 |
最近记录: |