我有类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().
| 归档时间: |
|
| 查看次数: |
15517 次 |
| 最近记录: |