如何将参数传递给包装在 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 中可以省略。
您可能会捕获更多或不同的参数。