我有课程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_N
和DerivedType
之间创建一个映射。
每当创建Derived_N
时,此映射都会查看特定DerivedType
的{{1}}是否已存在并返回它,否则在地图中创建新的并存储。
实际问题:
有没有办法在地图中将Derived_N
数据类型用作键?
我不怕任何模板 - 元程序解决方案。
或者是如何实现我的目标的优雅方式?
修改日期类型 - >数据类型,我的意思是像ClassType,对不起:)
我想使用它:
std::map
Derived_5 d;
DerivedType dt = getType(d); //Derived_5 is looked up in map, returning particular DerivedType
dt.getId();
的每个实例(具有相同的'N')应该具有相同的ID,通过DerivedType
EDIT2 - 我的回答 我找到了解决问题的更好方法......就像这样:
Derived_N
因为我的问题是如何在地图中使用数据类型,我会标记你的一些答案,谢谢
答案 0 :(得分:61)
C ++ 11通过在std::type_index
中提供<typeindex>
来解决这个问题,std::type_info
是一个可复制,可比较且可清除的对象,由#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;
}
对象构成,可用作关键字关联容器。
(实现相当简单,所以即使你自己没有C ++ 11,也可以从GCC 4.7中窃取实现,并在你自己的代码中使用它。)
{{1}}
答案 1 :(得分:14)
您可以直接使用typeid(object)
,因为type_info::before
可以用作比较器,如果您在地图中使用type_info作为键,请参阅What is `type_info::before` useful for?。无需获取.name()
。
答案 2 :(得分:0)
您可以使用您想要的任何类型或类作为std::map
的键,前提是您为模板参数提供了一个比较函数,告诉它如何对基础树进行排序。
最简单的做法是将日期表示为键,将它们转换为unix时间戳,但无论它们的类表示是什么,只需为地图的定义提供一个比较函数,你就可以了。去。