gpt4 book ai didi

来自不同类的 C++ 多个回调成员函数,没有 std 和 boost

转载 作者:太空狗 更新时间:2023-10-29 20:23:01 25 4
gpt4 key购买 nike

我是 C++ 的新手,我不想使用任何库,因为我想真正了解内部发生的事情。此外,我尽量保持我的库使用率尽可能低(以提高性能和)使其尽可能独立于平台(不导出库)。
所以总而言之,我不想使用 std 或 boost 来解决这个问题。

我的问题:

我有一个具有以下功能的 EventHandler:

template<class T> void EventHandler::SetCallbackFunction(T* obj, void (T::*mem_fkt)(void));

我必须保存对象和函数以便稍后调用它。
有两种可能性:

  • EventHandler 作为模板类(和 typedef)
  • void* -> 但要调用该函数,我需要将其强制转换回来,为此我需要类名 :/

为什么这些不起作用:- EventHandler 不能是模板类,因为它需要处理多个类。- void* -> 我不知道如何保存类名以供稍后使用

我该怎么做?
(或者有另一种方法吗?也许是一种保存类名以便稍后使用的方法?)

编辑:
此外,我可能需要为每个类注册多个回调函数,因此接口(interface)并不是一个真正的选择。

class A {
public:
void CallbackFktForEventHandler();
void CallbackFktForAnimationHandler();
etc...
};

而且我知道您可以根据以下内容解决它:

class A{
public:
void Callback();
static void CallbackStatic(void* self){
static_cast<A*>->CallBack();
};
};

但这对我的口味来说太过限制了。

最佳答案

你可以试试这个:

创建一个只有一个函数call()的(纯虚拟)基类:

class Function{
virtual void call()=0;
}

创建一个模板类,它存储一个函数指针和一个对象,并使其继承自 Function

template<typename T>
class TemplatedFunction{
void (T::*m_fkt)(void);
T* m_obj;

TemplatedFunction(T* obj, void (T::*fkt)(void)):m_fkt(fkt),m_obj(obj){}

void call{
(m_obj->*m_fkt)();
}
}

然后将指向 Function 的指针存储在您的事件处理程序中,只需使用 Function->call()

在线试用:http://ideone.com/3Hu5pw

但如果您至少使用标准库,您的生活会轻松很多。基本上我会使用 std::bind 将你的对象和你的成员函数绑定(bind)到一个函数 void()(void),然后将这些对象存储在一个 std::vector 中。

编辑:Oktalist 更快;)

关于来自不同类的 C++ 多个回调成员函数,没有 std 和 boost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35119294/

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