C++ C++;编译时的类型id

C++ C++;编译时的类型id,c++,hash,compile-time,typeid,C++,Hash,Compile Time,Typeid,我想在编译时根据类的派生类型生成类的哈希。今天,我像这样生成它: template<class Type> class TypeBase { public: static const unsigned s_kID; }; template<class Type> const unsigned TypeBase<Type>::s_kID = hash(typeid(Type)); 模板 类类型库 { 公众: 静态常量无符号s_kID; }; 模板

我想在编译时根据类的派生类型生成类的哈希。今天,我像这样生成它:

template<class Type>
class TypeBase 
{
public:
    static const unsigned s_kID;
};

template<class Type>
const unsigned TypeBase<Type>::s_kID = hash(typeid(Type));
模板
类类型库
{
公众:
静态常量无符号s_kID;
};
模板
const unsigned TypeBase::s_kID=hash(typeid(Type));
但这会生成(非常不必要的)运行时初始化代码(hash(..)函数会基于std::type_info::name()进行简单的哈希)


想法?

考虑到进程启动时发生的所有其他事情,以及您现有的代码是多么简单和优雅,假设您不散列大量类型,我会让您现有的解决方案保持原样。

谢谢。过早优化的情况,嗯?;)的确只要您没有任何运行时影响,就像用户抱怨应用程序启动时间过长150微秒一样,就让它保持原样。不要尝试将该变量的指针强制转换为unsigned,因为这是不可移植的。@robert是的,在我看来是这样。现在我发现自己再次需要非RTTI类型的信息来创建ID,仅仅是因为我想去掉我的可执行文件中的RTTI符号:)那么从生成的type_info对象的地址计算散列值呢?这应该更便宜,甚至是唯一的,或者不是?是否存在哈希冲突的风险,或者这不是问题?@Andreas:创建哈希时,我还有一个包含哈希项的映射。因此,我可以检查是否存在碰撞。除此之外,类的数量可能是20个,所以我想我也可以这样做。你不能做一些像
id=++someGlobalCounter
这样的事情吗?(我意识到这不是性能关键,只是好奇而已)@Andreas:该类用于IPC通信,我不确定全局计数器是否能确保通信双方“同步”(即,对于同一类型具有相同的id)。通过散列保证(只要使用两个应用程序的同一C++编译器)。