我想将指针映射到整数以用于序列化。指针可以是不同类型的,并且可以指向可能使用多重继承的多态对象。我需要查询地图以了解指针是否存储在其中,如果是,那么关联的整数值是什么。
这样做的正确方法是什么?
我想到的map<void*, int>
的简单方法不起作用,因为operator <
没有为任意指针定义。或者这在普通系统上不是问题吗?
另一个解决方案是拥有vector<void*>
。但这需要遍历存储在中的所有指针,我不确定转换为void *
是否会破坏使用继承的对象的operator ==
。
答案 0 :(得分:6)
您对使用map<void*, int>
的初步想法很满意
尽管你没有为指针定义operator<
是正确的,但std::map<>
使用的谓词是std::less<>
,而C ++标准要求std::less<T*>
也适用于任意指针。
引用C ++标准来支持这个([lib.comparisons] / 8):
对于模板
greater
,less
,greater_equal
和less_equal
,任何指针类型的特化都会产生总顺序,即使内置运算符{{ 1}},<
,>
,<=
不会。
答案 1 :(得分:1)
为什么不简单地为所有可序列化的类引入一个虚拟基类?
class Serializable
{
};
map< Serializable *, int > integralMap;
答案 2 :(得分:0)
你可以只做一个unsigned int32 / 64到int的映射(取决于x86或x64)。只需将void *转换为unsigned int,它就会愉快地进行比较。
答案 3 :(得分:0)