【问题标题】:Storing any type or struct in an std::map在 std::map 中存储任何类型或结构
【发布时间】:2012-04-06 14:47:01
【问题描述】:

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

  1. 事件类型(std::string)
  2. 实体 ID(无符号整数)- 这是用于游戏引擎的
  3. 事件数据(std::map<:string>)

要填充“事件数据”映射,我需要能够存储任何数据类型或结构,例如 int、string 或 Vector3 (struct),以提供一些示例。我怎样才能做到这一点?或者,也许有更好的方法可以完全做到这一点......

在不相关的注释中,事件类型和数据名称使用 char* 还是字符串更好?

【问题讨论】:

  • 别用std::string
  • 为什么? (不是质疑你的判断,我只是想知道)
  • 它更简单、标准并且可以防止错误。可能在某些极端情况下 char* 更好,但您几乎永远不会有足够好的理由证明在 std::string 上使用 char* 是合理的。
  • carleeto 刚刚向我解释了为什么我不应该在这里使用 char*,但是没关系。

标签: c++ events map


【解决方案1】:

试过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 将具有不同的地址,即使它们是相同的字符串。

【讨论】:

  • 如果我不需要,我宁愿不使用枚举。不,我从未使用过Boost。不过,我会试一试。
  • 哦,是的,这是有道理的。如果我认为我需要轻微的性能提升,我会切换到枚举;)
  • 如果你想要你的类型的文字描述,你总是可以使用 std::string GetDescription(EventType t); 这样的函数
  • 要了解性能差异,没有什么比测试更好的了。使用字符串映射并将其与整数映射进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 2021-09-25
  • 2019-12-12
  • 2014-09-02
  • 2014-03-23
相关资源
最近更新 更多