无法向向量添加回调
Failed to add callback to vector
我正在使用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
实例处于活动状态。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 无法向向量添加回调
- 如何使用std::bind向信使系统添加成员回调
- 在回调(CPXcutcallbackadd)中添加用户剪切后,如何编写问题公式(CPXwriteprob)
- 在WNDClasSex中断代码中将代码添加到WNDPROC回调中
- cocos2d-x添加触摸事件回调错误
- 在QDialog中为按键事件添加回调,而不扩展类
- 有时是否可以链接pad从pad外部添加回调
- Wt从http响应回调中添加新的小部件
- 向可变模板类添加回调-不可能