gpt4 book ai didi

c++ - 如何将参数传递给包装在 std::function 中的成员函数?

转载 作者:行者123 更新时间:2023-12-04 16:36:28 25 4
gpt4 key购买 nike

起初我似乎很清楚我不应该能够做到这一点,但后来我发现它可以用自由函数来完成。

这是一个示例,其中我将 void() 函数从子级传递给父级。 parent 在他们的框架出现时调用该函数。

我已经弄清楚了传递带参数的自由函数的语法,但我不知道如何传递带参数的 Child 的成员函数。

请帮忙。

#include <iostream>
#include <vector>
#include <map>
#include <functional>

void f_Free1() { std::cout << "Hi there hello. I'm a free function without arguments."; }
void f_Free2(int i) { std::cout << "Hi there hello. I'm a free function with an argument. It's " << i; }

class Parent
{
std::map<unsigned int, std::vector<std::function<void()>>> Tasks;

protected:

void addTask(unsigned int frame, std::function<void()> task) { Tasks[frame].push_back(task); }

public:

virtual ~Parent() {}
unsigned int Frame = 0;

void tick()
{
if (Tasks.count(Frame))
{
for (auto task : Tasks[Frame])
{
task();
}
}

Frame++;
}
};

class Child : public Parent
{
void f_Child1() { std::cout << "This is a private Child function without arguments. "; }
void f_Child2(int i) { std::cout << "This is a private Child function with an argument. It's " << i; }

public:

Child()
{
addTask(3, f_Free1);
addTask(5, [a = int(4)] () { f_Free2(a); } ); // THIS WORKS!!!

addTask(7, std::function<void()> { std::bind(&Child::f_Child1, this) });
addTask(9, std::function<void()> { std::bind([a = int(4)]() { &Child::f_Child2(a), this) } }); // CAN'T MAKE THIS WORK
}
};

int main()
{
Child child;

for (unsigned int i = 0; i < 12; i++)
{
std::cout << "[" << child.Frame << "]";
child.tick(); // runs tasks whose frames are up
std::cout << std::endl;
}

return 0;
}

最佳答案

抛弃 bind

使用 [this]() { f_Child1(); }[this]() { f_Child(4);

此外,免费版本可以只是 []() { f_Free2(4);

关于c++ - 如何将参数传递给包装在 std::function<void()> 中的成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69388842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com