在for_each lambda中调用对象函数?

时间:2013-11-23 23:29:04

标签: c++ c++11 foreach lambda

我正试图在C ++中掌握lambdas。

这是我的代码(为了理解而简化的变量):

template <typename Container>
void do_function(const Container& c, const item &w){

complex<double> a(w.x1, w.y1);
complex<double> b(w.x3, w.y3);

for_each(begin(c), end(c), [] {
    p->inner_function(a, b);
});
}

我知道p意味着什么,只是在那里说明我想做什么。

基本上,我想在任何类型的容器(列表/向量等)上使用此函数,该容器包含名为Animal的抽象类的指针实例。这些实例都有'inner_function(复杂,复杂)'的实现。

我想在C ++ 11中使用lambdas在for_each循环中对每个函数调用该函数。

网上的例子虽然有点令人困惑。

3 个答案:

答案 0 :(得分:4)

看来,你想用

std::for_each(std::begin(c), std::end(c), [=](Animal* p) { p->inner_function(a, b); });

你的lambda函数需要接受一个参数,因为std::for_each()期望一个可以用*std::begin(c)的结果调用的函数。需要明确声明参数。您还需要选择如何捕获参数ab。使用[]表示没有捕获的上下文,您根本无法访问任何本地变量。你可以使用

  • [=]按值捕获上下文中的所有变量。
  • [&]通过引用捕获上下文中的所有变量。
  • 您可以通过明确提及变量来覆盖默认设置:
    • [=,&a]将按值ba引用。
    • [&,b]相同,但以不同的默认值
    • 开头
    • [&a,b]相同但明确列出所有参数。

实际上使用std::bind()表达式可能更容易:

std::for_each(std::begin(c), std::end(c), std::bind(&Animal::inner_function, _1, a, b));

由于你没有提出问题,不清楚问题是什么。

答案 1 :(得分:2)

如果Container将是vector<Animal*>list<shared_ptr<Animal>>等,那么我认为你想要的是:

for_each(begin(c), end(c), [&](typename Container::value_type p) {
    p->inner_function(a, b);
});

要同时支持unique_ptr,您可能需要typename Container::value_type const &p

或使用“基于范围的for循环”:

for(auto p : c) {
    p->inner_function(a, b);
}

同样,auto &选项允许不可复制的p

答案 2 :(得分:1)

容器必须包含指针才能使用多态。我将使用智能指针:

std::vector<std::unique_ptr<Animal>> v;
item w;

do_function(v, w);

算法std::for_each将每个元素传递给仿函数。它传递它们,使得仿函数可以根据需要通过值或引用来获取参数。 unique_ptr需要参考:

for_each(begin(c), end(c), [] (std::unique_ptr<Animal> &p) {
    p->inner_function(a, b);
});

仿函数还需要访问ab。您可以明确捕获它们:

[a,b] (std::unique_ptr<Animal> &p) {

或者正如Steve Jessop建议的那样,只使用基于范围的for,这要简单得多。使用unique_ptr,它看起来像:

for(auto &p : c) {
    p->inner_function(a, b);
}