我正在使用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
答案 0 :(得分:1)
如果没有类的实例,则无法调用非静态成员函数指针来调用它。我猜你想要在Button
函数对象中捕获std::function
的实例。一种方法是使用lambda:
void Button::track()
{
Events::add_handler([this]{track_();});
}
通过捕获lambda中的this
,您可以隐式地在lambda体内的该实例上调用成员函数。
当然,您需要保证在调用回调时Button
实例是活动的。