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

时间:2012-03-25 10:17:56

标签: c++ templates

我有课程Base和课程Derived_1Derived_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的{​​{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

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

3 个答案:

答案 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时间戳,但无论它们的类表示是什么,只需为地图的定义提供一个比较函数,你就可以了。去。