gpt4 book ai didi

c++ - 无法将回调添加到 vector

转载 作者:行者123 更新时间:2023-11-30 05:02:19 28 4
gpt4 key购买 nike

我使用的是 Visual Studio 2015,我想附加 Button::track_功能到callbacks vector ,以便内部的所有功能 callbacks将在 invoke_all 时被调用事件类中的函数被调用。

buttons.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]();
}

我总是收到这个错误信息

Error C2893: Failed to specialize function template 'unknown-type 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实例在回调被调用时是存活的。

关于c++ - 无法将回调添加到 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49936579/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com