2012-03-25 115 views
20

我有类Base和类Derived_1,Derived_2 ... 我需要派生类有一个id。这些ID用于进一步查找等,因此需要连续(不只是一些随机数)。因为派生类是由用户创建的,所以id不能是Derived_N的成员。所以我想出了DerivedType这个课。在地图中使用数据类型(类类型)作为键

class DerivedType 
{ 
    static unsigned id; 
    unsigned m_id; 
public: 
    DerivedType() : m_id(id++) { } 
} 

现在我想创建Derived_NDerivedType之间的映射。 每当创建Derived_N时,此映射会查看DerivedType是否已经存在,并返回它,否则创建新的并在地图中存储。

实际问题: 有没有办法使用std::map数据类型在地图上关键? 我不害怕任何模板元程序解决方案。 或者有没有优雅的方式来实现我的目标?

编辑日期类型 - >数据类型,我的意思是像类类别,不好意思:)

我想用它喜欢:

Derived_5 d; 
DerivedType dt = getType(d); //Derived_5 is looked up in map, returning particular DerivedType 
dt.getId(); 

Derived_N每个实例(具有相同的“ N')应具有相同的ID THROU DerivedType

EDIT2 - 我的回答 我找到了更好的解决方案,我的问题......这是李柯本:

atomic_counter s_nextEventClassID; 

typedef int cid_t; 

template<class EventClass> 
class EventClassID 
{ 
public: 
    static cid_t getID() 
    { 
     static cid_t classID = EventClassID::next(); 
     return classID; 
    } 

    static cid_t next() { return ++s_nextEventClassID; } 
}; 

,因为我的问题是,如何在地图中使用的数据类型,我将迎来一些你的答案,谢谢

回答

43

C++ 11通过提供std::type_index,在<typeindex>,这是从可以用作关联容器的密钥的std::type_info对象构成的可复制,可比较和可哈希对象解决这个问题。 (实现相当简单,所以即使你自己没有C++ 11,也可以从GCC 4.7中窃取实现,并在你自己的代码中使用它。)

#include <typeindex> 
#include <typeinfo> 
#include <unordered_map> 

typedef std::unordered_map<std::type_index, int> tmap; 

int main() 
{ 
    tmap m; 
    m[typeid(main)] = 12; 
    m[typeid(tmap)] = 15; 
} 
+1

这应该是被接受的答案 – jupp0r 2016-11-14 15:47:53

+0

使用现代C++的很好的答案 – Anonymous 2017-06-14 10:32:43

0

你可以使用任何你想要的类型或类为重点,以std::map ,前提是你给模板参数一个比较函数,告诉它如何对底层树进行排序。

做恕我直言表示日期作为关键的最简单的事情就是将它们转换为unix时间戳,但不管它们的类表示是什么,只需提供一个比较函数来映射定义,而且你很好去。

13

您可以直接使用typeid(object),因为存在type_info::before,如果您在地图中使用type_info作为键,则可以将其用作比较器,请参见What is `type_info::before` useful for?。无需获得.name()

相关问题