C++ 将 lambda 和向量传递给 emplace_back 以用于自定义类构造函数

问题描述 投票:0回答:1
#include <iostream>
#include <fstream>
#include <functional>
#include <vector>
class Monkey
{
public:
  int itemsProcessed{0};
  std::vector<int> heldItems;
  std::function<int(int)> operationFunction;
  std::function<int(int)> testFunction;

  Monkey(std::vector<int> sI, std::function<int(int)> oF, std::function<int(int)> tF)
  {
    heldItems = sI;
    operationFunction = oF;
    testFunction = tF;
  }
  void addItem(int item)
  {
    heldItems.push_back(item);
  }
  std::vector<std::pair<int, int>> processItems()
  {
    std::vector<std::pair<int, int>> redistributedItems;
    for (auto i : heldItems)
    {
      int adjusted = operationFunction(i);
      // Divide by 3 after monkey doesn't break it. Floor is applied by default for int division
      adjusted /= 3;
      int toMonkey = testFunction(adjusted);
      redistributedItems.emplace_back(toMonkey, adjusted);
    }
    return redistributedItems;
  }
};

int main(int argc, char *argv[])
{
  std::vector<Monkey> monkeyList;
  monkeyList.emplace_back(
      {79, 98}, [](int a) -> int
      { return a * 19; },
      [](int a) -> int
      { return a % 23 ? 2 : 3; });
  return EXIT_SUCCESS;
}

如果您想知道,这是我正在为代码的出现而开发的解决方案,而不是任何类型的编程作业。

我面临的问题是我想在我的主要方法中创建 Monkey 对象的向量。在我看来,我应该能够将 Monkey 类构造函数(向量、lambda、lambda)的参数传递给向量类的 emplace_back 函数。每当我尝试上面的代码时,我都会收到以下错误:

error: no matching function for call to 'std::vector<Monkey>::emplace_back(<brace-enclosed initializer list>, main(int, char**)::<lambda(int)>, main(int, char**)::<lambda(int)>)'
   41 |   monkeyList.emplace_back(
      |   ~~~~~~~~~~~~~~~~~~~~~~~^
   42 |       {79, 98}, [](int a) -> int
      |       ~~~~~~~~~~~~~~~~~~~~~~~~~~
   43 |       { return a * 19; },
      |       ~~~~~~~~~~~~~~~~~~~
   44 |       [](int a) -> int
      |       ~~~~~~~~~~~~~~~~
   45 |       { return a % 23 ? 2 : 3; });

如果我将 emplace_back 的参数包装在大括号中以使用大括号初始化,则会收到以下错误:

error: no matching function for call to 'std::vector<Monkey>::emplace_back(<brace-enclosed initializer list>)'
   42 |   monkeyList.emplace_back({{79, 98}, [](int a)
      |   ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
   43 |                            { return a * 19; },
      |                            ~~~~~~~~~~~~~~~~~~~
   44 |                            [](int a)
      |                            ~~~~~~~~~
   45 |                            { return a % 23 ? 2 : 3; }});

什么给予?我希望 MonkeyList[0] 成为一个对象,其中heldItems = 两个整数(79 和 98)的向量,一个 lambda 的操作函数,它接受一个 int 并返回 19 * 该 int,以及一个返回 2 的 lambda(如果模数为否则 int 为 23 或 3。对于 C++ 来说相对较新,因此我们将不胜感激。谢谢。

c++ lambda c++20 stdvector
1个回答
1
投票

问题在于,当你传递它时,

emplace_back
不知道
{79, 98}
的类型。所以你必须指定它是一个
std::vector<int>

  monkeyList.emplace_back(
      std::vector<int>{79, 98}, [](int a) -> int
      { return a * 19; },
      [](int a) -> int
      { return a % 23 ? 2 : 3; });

原因是因为emplace_back使用的是模板参数,而

{79, 98}
可以是任何东西,所以编译器不知道它是什么,也不允许猜测。

© www.soinside.com 2019 - 2024. All rights reserved.