【发布时间】:2021-03-14 17:21:53
【问题描述】:
我正在编写一个消息传递系统,我现在有一个模板类,用于处理消息处理程序在消息传递系统中的注册和注销。传递给 register 函数的函数 * 是模板化的,我需要一种方法将其转换为某种常见值,我可以将其添加到某种查找表中,以便取消注册它。当/如果我转换它时,我不需要调用该函数*,我只想要一个一致的指针值进行查找。 这是我目前所拥有的,但并不完全有效。
template <typename CLASSTYPE>
class MessageRegister
{
public:
template <typename MESSAGETYPE>
void RegisterMessageHandler(void(CLASSTYPE::*function)(MESSAGETYPE*), std::string messageTypeName)
{
if (!MessageHandlerRegistered(&function, messageTypeName))
{
MessageHandler<CLASSTYPE, MESSAGETYPE>* messageHandler = new MessageHandler<CLASSTYPE, MESSAGETYPE>((CLASSTYPE *)this, function);
RegisterMessageHandlerMessage registerMessage(messageHandler, Core::GetInstance().GetMessageType(messageTypeName));
Core::GetInstance().BroadcastMessage(®isterMessage);
AddMessageHandler(&function, messageTypeName, messageHandler);
}
}
private:
std::unordered_map<std::string, std::unordered_map<void*, IHandler*>> messageHandlers;
void AddMessageHandler(void* function, std::string messageType, IHandler* messageHandler)
{
messageHandlers[messageType][function] = messageHandler;
}
bool MessageHandlerRegistered(void* function, std::string messageType)
{
std::unordered_map<std::string, std::unordered_map<void*, IHandler*>>::iterator messageTypeIterator = messageHandlers.find(messageType);
if (messageTypeIterator == messageHandlers.end())
return false;
std::unordered_map<void*, IHandler*>::iterator functionInterator = messageTypeIterator->second.find(function);
if (functionInterator == messageTypeIterator->second.end())
return false;
return true;
}
}
这里最大的问题是获取函数的地址 * 并将其用作 void * 并不一致,所以当我取消注册消息处理程序并传入同一个函数 * 时,该地址不是t 与查找表中的内容相同,无法正确删除。
所以我的问题是,是否有一个通用函数 * 类型我可以将所有这些模板化函数指针转换为用作查找表中的键?如果没有,谁能想到存储我的消息处理程序的其他选项?消息处理程序的两个键是函数 * 和 messageTypeName,因为我从未见过一个函数将多次注册到消息类型的情况。
谢谢!
【问题讨论】:
标签: c++ function pointers templates messaging