在std :: map中存储任何类型或结构

时间:2012-03-22 02:12:46

标签: c++ events map

我正在用C ++编写基于主题的发布/订阅系统。我的通用“事件”类有三个部分:

  1. 事件类型(std :: string)
  2. 实体ID(unsigned int) - 这是针对游戏引擎的
  3. 事件数据(std :: map< std :: string,???>)
  4. 要填充“事件数据”映射,我需要能够存储任何数据类型或结构,如int,string或Vector3(struct),以提供一些示例。我怎样才能做到这一点?或者,也许有更好的方法来完成这个......

    在一个不相关的说明中,对事件类型和数据名称使用char *或字符串是否更好?

1 个答案:

答案 0 :(得分:3)

尝试boost:any

对于您的事件类型,您为什么使用字符串? std :: maps按从低到高的键值排序存储。 这意味着在内部,您将要排序字符串。 尝试并尽可能简单地开始。使用枚举,这应该使您的地图更快,特别是因为它们将成为通知系统的基础。

最后,您不想使用char *,因为地图无法按预期运行:

char* key1 = "Hi";
char* key2 = "Hi";
unsigned int id;
std::map< char* ,unsigned int > mymap;
mymap.insert( std::pair<char*,unsigned int>( key1, id ) );
mymap.insert( std::pair<char*,unsigned int>( key2, id ) ); //you've just created a duplicate entry

原因是key1和key2将具有不同的地址,即使它们是相同的字符串。