无法将回调添加到矢量

时间:2018-04-20 07:44:26

标签: c++ callback

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

buttons.h

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

buttons.cpp

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

void Button::track_() { ... }

events.h

typedef std::function<void()> cb;
extern std::vector<cb> callbacks;

class Events
{
public:
    static void add_handler(cb);
    static void invoke_all();
};

events.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:无法专门化功能模板'unknown-type std :: invoke(_Callable&amp;&amp;,_ Types&amp;&amp; ...)'SDL d:\ programs \ microsoft visual studio 2015 \ vc \ include \ type_traits 1494

1 个答案:

答案 0 :(得分:1)

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

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

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

当然,您需要保证在调用回调时Button实例是活动的。