游戏人生

不积跬步,无以至千里;不积小流,无以成江海。

My Links

Blog Stats

[原] RTTI 为什么type_info 有比较操作

The lifetime of the object returned by typeid extends to the end of the program.

 

根据C++标准, typeid()返回的type_info对象的生命周期那么长, 那么能不能通过直接比较指针来判断类型一致? 例如 std::map<const std::type_info*, ...>

但是type_info又带了自己的比较操作, 例如==, !=, before(), 显然这些可以用来排序和查找.那么直接比较指针不行吗?

 

因为blade的data-binding使用了C++的RTTI, 顺便考虑了下这个问题. 原来type_info对象虽然一直有效, 但是并不能保证唯一:

http://stackoverflow.com/questions/1819114/when-can-typeid-return-different-type-info-instances-for-same-type

也就是说不同的dll/so里面产生的对象是不一样的, 所以直接比较指针不行. 不过可以通过type_info自带的比较操作得出顺序和相等与否.

 

1 struct type_info_less
2 {
3     bool operator()(const std::type_info* lhs, const std::type_info* rhs)
4     {
5         return lhs->before(*rhs);
6     }
7 }
8 typedef std::map<const std::type_info*, T, type_info_less> info_map;

 

虽然说before()是implementation-specific的类型顺序, 但是对于同一个程序, 在runtime应该是一致的. 除非用了两个不同的编译器,再链接? 这种情况下通常之用C做接口(extern "C"), 不会用C++, 即便用了往往链接不了.

所以说可以拿before来排序, 因为只是排序用于查找, 所以typeid(int)和typeid(char)到底那个在前, 这并不重要.

posted on 2015-08-28 11:09 crazii 阅读(...) 评论(...) 编辑 收藏