使用数据类型(类类型)作为映射中的键

rel*_*xxx 30 c++ templates

我有类Base和类Derived_1,Derived_2...我需要派生类来获取id.那些id用于进一步查找等,因此需要是连续的(不只是一些随机数).因为派生类是由用户创建的,所以id不能是其成员Derived_N.所以我想出了DerivedType课.

class DerivedType
{
    static unsigned id;
    unsigned m_id;
public:
    DerivedType() : m_id(id++) {  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想在Derived_N和之间创建一个映射DerivedType.每当Derived_N创建,这个映射如下,如果DerivedType针对特定Derived_N已经存在,并返回,否则创建的新地图和商店.

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

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

我想用它像:

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

Derived_N(具有相同的'N')的每个实例应该具有与DerivedType相同的id

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; }
};
Run Code Online (Sandbox Code Playgroud)

既然我的问题是如何在地图中使用数据类型,我会标记你的一些答案,谢谢

Ker*_* SB 65

C++ 11通过提供std::type_indexin 来解决这个问题<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;
}
Run Code Online (Sandbox Code Playgroud)


eud*_*xos 14

您可以typeid(object)直接使用,因为type_info::before如果您在地图中使用type_info作为键,可以用作比较器,请参阅什么是`type_info :: before`有用?.没必要.name().