#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++来说,这是一个相对较新的东西,因此感谢任何帮助。谢谢。
1条答案
按热度按时间eimct9ow1#
问题是
emplace_back
在你传递它的时候不知道它的类型,所以你必须指定它是std::vector<int>
。原因是因为emplace_back使用的是模板参数,
{79, 98}
可以是任何东西,所以编译器不知道它是什么,也不允许猜测。