【发布时间】:2011-09-27 18:20:33
【问题描述】:
我一直在到处寻找这个,我似乎无法找到一个直接的答案。一些消息来源说这是不可能的,但这只会对我提出更多问题,我将在下面进一步解释。
所以情况就是这样。假设我有一个自定义容器类,其选择功能如下所示(这只是一个示例):
template <typename T>
class Container {
public:
// ...
Container<T> select(bool (*condition)(const T&)) const;
// ...
};
如您所见,select 函数接受一个指向 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); });
我的问题是,这可能吗?如果是这样,我的函数原型应该是什么,Container::select() 才能接受 lambda 作为其参数之一?
如果不可能,那么像std::for_each 这样可以使用 lambda 表达式作为其参数之一的东西是如何实现的?任何能清楚解释这一点的资源将不胜感激。我发现的所有内容都只是给出了 lambda 函数的示例并使用 std::function<> 将它们作为参数传递,但没有解释 std::for_each 如何与 lambda 函数一起使用。
我想指出,此代码未按原样编译/测试。它仅用于演示目的。我已经尝试在实际项目中实现相同的原则,但它不起作用。
【问题讨论】: