#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++ 来说相对较新,因此我们将不胜感激。谢谢。
问题在于,当你传递它时,
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}
可以是任何东西,所以编译器不知道它是什么,也不允许猜测。