无法向向量添加回调

Failed to add callback to vector

本文关键字:添加 回调 向量      更新时间:2023-10-16

我正在使用Visual Studio 2015,我想将Button::track_函数附加到callbacks向量,以便在调用事件类中的invoke_all函数后调用callbacks中的所有函数。

按钮.h

class Button:
    public Texture
{
public:
    void track();
}

按钮.cpp

void Button::track()
{
    Events::add_handler(&Button::track_);
}
void Button::track_() { ... }

事件.h

typedef std::function<void()> cb;
extern std::vector<cb> callbacks;
class Events
{
public:
    static void add_handler(cb);
    static void invoke_all();
};

事件.cpp

std::vector<cb> callbacks;
void Events::add_handler(cb c)
{
    callbacks.push_back(c);
}
void Events::invoke_all()
{
    decltype(callbacks.size()) i = 0;
    for (; i < callbacks.size(); i++)
        callbacks[i]();
}

我总是收到此错误消息

错误 C2893:无法专用化函数模板"未知类型 std::invoke(_Callable &&,_Types &&...(" SDL d:\programs\Microsoft Visual Studio 2015\vc\include\type_traits 1494

如果没有要调用它的类实例,则无法调用非静态成员函数指针。我猜你想在std::function函数对象中捕获Button的实例。一种方法是使用 lambda:

void Button::track()
{
    Events::add_handler([this]{track_();});
}

通过捕获 lambda 中的this,您可以在 lambda 主体中隐式调用该实例上的成员函数。

当然,您需要保证在调用回调时Button实例处于活动状态。