如何将参数传递给包装在 std::function<void()> 中的成员函数?
How to pass an argument to a member function wrapped in std::function<void()>?
起初我似乎很清楚我不应该能够做到这一点,但后来我发现它可以用自由函数来完成。
这是我将 void() 函数从 Child 传递到 Parent 的示例。 parent 在他们的 Frame 出现时调用该函数。
我已经弄清楚了传递带参数的自由函数的语法,但我不知道如何传递带参数的 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); }
。
std::bind
的语法为:
std::bind(&f_Free1)
std::bind(&f_Free2, 4)
std::bind(&Child::f_Child1, this)
std::bind(&Child::f_Child2, this, 4)
但是lambda对大多数人来说更简单:
&f_Free1
可以,否则 [](){ return f_Free1(); }
[](){ return f_Free2(4); }
[this]() { return this->f_Child1(); )
[this]() { return this->f_Child2(4); )
return
这里可以省略为函数return void
.
this->
在 lambda 中可以省略。
您可能会捕获更多或不同的参数。
起初我似乎很清楚我不应该能够做到这一点,但后来我发现它可以用自由函数来完成。
这是我将 void() 函数从 Child 传递到 Parent 的示例。 parent 在他们的 Frame 出现时调用该函数。
我已经弄清楚了传递带参数的自由函数的语法,但我不知道如何传递带参数的 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); }
。
std::bind
的语法为:
std::bind(&f_Free1)
std::bind(&f_Free2, 4)
std::bind(&Child::f_Child1, this)
std::bind(&Child::f_Child2, this, 4)
但是lambda对大多数人来说更简单:
&f_Free1
可以,否则[](){ return f_Free1(); }
[](){ return f_Free2(4); }
[this]() { return this->f_Child1(); )
[this]() { return this->f_Child2(4); )
return
这里可以省略为函数return void
.
this->
在 lambda 中可以省略。
您可能会捕获更多或不同的参数。