我正试图在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循环中对每个函数调用该函数。
网上的例子虽然有点令人困惑。
答案 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)
的结果调用的函数。需要明确声明参数。您还需要选择如何捕获参数a
和b
。使用[]
表示没有捕获的上下文,您根本无法访问任何本地变量。你可以使用
[=]
按值捕获上下文中的所有变量。[&]
通过引用捕获上下文中的所有变量。[=,&a]
将按值b
和a
引用。[&,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);
});
仿函数还需要访问a
和b
。您可以明确捕获它们:
[a,b] (std::unique_ptr<Animal> &p) {
或者正如Steve Jessop建议的那样,只使用基于范围的for
,这要简单得多。使用unique_ptr
,它看起来像:
for(auto &p : c) {
p->inner_function(a, b);
}