【问题标题】:Vector of function with lambda functions带有 lambda 函数的函数向量
【发布时间】:2019-11-27 12:04:18
【问题描述】:

此代码不正确:

std::vector<int (*)(int)> fv;

for (int i=0; i<10; i++)
{
   auto g = [i](int n) -> int
   {
      return n+i;
   };

   fv.push_back(&g);
}

因为 lambda 函数不是 int (*)(int) 类型,而是一个对象。 我的问题是:vector&lt;...&gt; 必须输入什么类型?

【问题讨论】:

  • function&lt;int(int)&gt;,也不存储指向局部变量的指针,即fv.push_back(g);
  • 我不知道“功能”。你能给我解释一下吗?
  • std::function,它只是可复制对象的包装器。
  • 一旦您使用捕获,您的 lambda 就与简单的函数原型不匹配。最好将其视为具有 operator() 和其他成员来处理捕获的临时类,并且它可能以这种方式实现。 std::function 是一个模板,可以用 () 操作表示任何对象,包括 lambdas。
  • 感谢您尝试疯狂的 lambda 向量。我仍然不确定如何在实践中使用它!

标签: c++ function vector


【解决方案1】:

您可以使用库类型std::function

例如:

#include <vector>
#include <functional>

void foo() {
  std::vector<std::function<int(int)>> fv;

  for (int i = 0; i < 10; ++i) {
    fv.emplace_back([i](int n) {
      return n + i;
    });
  }
}

【讨论】:

    【解决方案2】:

    原始代码的问题在于 lambda 进行了捕获(索引 i)。 如果没有捕获,则 lambda 将可转换为指向函数的 int(*)(int) 指针,并且代码将编译。

    使用 std::function 是可行的,但它会带来性能损失,所以更好的问题是你打算用函子向量解决什么问题?

    【讨论】:

    • 我只想创建一个函数向量,看看是否可以在 c++ 中实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2020-07-04
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2019-06-15
    • 2020-10-26
    相关资源
    最近更新 更多