2013-11-23 84 views
0

我正试图去掌握C++中的lambdas。在for_each lambda中调用对象函数?

这里是我的代码(简化理解变量):

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(复杂,复杂)'的实现。

我想打电话给每个这些该功能在使用lambda表达式在C++ 11的for_each循环..

的在线的例子都有点混乱,但。

+0

你在做什么? – 0x499602D2

+0

对于初学者来说,'p'没有被声明,显然没有指定'捕捉模式',所以它不知道a和b是什么。 –

回答

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)); 

因为你没问一个问题,目前还不清楚问题是什么,但。

+0

这是完美的,我真的明白为什么现在。 我基本上不知道你使用了什么(动物* p),我不知道[=]和[&]。谢谢! –

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) { 

或者史蒂夫·杰索普指出,只要使用基于范围for,这要简单得多。随着unique_ptr它会是什么样子:

for(auto &p : c) { 
    p->inner_function(a, b); 
} 
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(auto p : c) { 
    p->inner_function(a, b); 
} 
auto &选项允许不可复制 p

同样。

+0

'typename Container :: value_type' – bames53

+0

@ bames53:我知道我应该记住lambda的参数声明是否是一个暗示类型的上下文,但我会接受你的话:-) –

+0

你实际上是要想要使用[&](decltype(* end(c))p){p-> inner_function(a,b); }因为你希望p是一个引用(可能是const,取决于c),在c是unique_ptr的容器的情况下。 – Nevin