C++将lambda和向量传递给定制类构造函数的emplace_back

ulydmbyx  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(132)
#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;
}

如果你想知道的话,这是一个解决方案,我正在为代码的出现而工作,而不是任何种类的编程任务。
我所面临的问题是我想在main方法中创建一个Monkey对象的向量。在我看来,我应该能够将Monkey类构造函数(vector,lambda,lambda)的参数传递给vector类的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]是一个对象,其中holdItems =两个int的向量,79和98,一个lambda的operationFunction,它接受一个int并返回19 * 该int,以及一个lambda,如果int的模是23或3,则返回2。对于C++来说,这是一个相对较新的东西,因此感谢任何帮助。谢谢。

eimct9ow

eimct9ow1#

问题是emplace_back在你传递它的时候不知道它的类型,所以你必须指定它是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}可以是任何东西,所以编译器不知道它是什么,也不允许猜测。

相关问题