【问题标题】:Casting Template Function Pointers to Common Type将模板函数指针转换为通用类型
【发布时间】: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(&registerMessage);
      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


    【解决方案1】:

    我想我找到了一个可行的解决方案,我可以通过执行以下操作将函数 * 转换为 void *。

    void* ptr = reinterpret_cast<void*&>(function);
    

    并将其传入并使用该 void * 作为键,它似乎是一致的。 如果有人有更好或不同的解决方案,我很想听听,但目前它正在按预期工作。

    谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 2021-09-20
      • 2010-10-08
      相关资源
      最近更新 更多