【问题标题】:Calling an object function in a for_each lambda?在 for_each lambda 中调用对象函数?
【发布时间】:2013-11-23 23:29:03
【问题描述】:

我正在尝试掌握 C++ 中的 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(complex, complex)”的实现。

我想在 for_each 循环中使用 C++ 11 中的 lambda 在其中的每一个上调用该函数..

不过网上的例子都有些混乱。

【问题讨论】:

  • 你在做什么有什么问题?
  • 对于初学者来说,'p' 没有被声明,显然没有指定'捕获模式',所以它不知道 a 和 b 是什么。

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


【解决方案1】:

看来,你想用

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

您的 lambda 函数将需要一个参数,因为 std::for_each() 需要一个可以使用 *std::begin(c) 的结果调用的函数。参数需要显式声明。您还需要选择如何捕获参数ab。使用[] 意味着没有捕获的上下文,您根本无法访问任何局部变量。你可以使用

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

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

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

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

【讨论】:

  • 这是完美的,我现在明白为什么了。当您使用 (Animal* p) 时,我基本上不确定该使用什么,而且我不知道 [=] 和 [&]。谢谢!
【解决方案2】:

如果Container 将变为vector&lt;Animal*&gt;list&lt;shared_ptr&lt;Animal&gt;&gt; 等,那么我想你想要的是:

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

要同时支持unique_ptr,您可能希望将其设为typename Container::value_type const &amp;p

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

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

auto &amp; 的选项类似,以允许不可复制的p

【讨论】:

  • typename Container::value_type
  • @bames53:我知道我应该记住 lambda 的参数声明是否是暗示类型的上下文,但我相信你的话 :-)
  • 你实际上会想要使用类似 [&](decltype(*end(c)) p){ p->inner_function(a, b);因为在 c 是 unique_ptr 的容器的情况下,您希望 p 成为引用(可能是 const,取决于 c)。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多