C++ C++;-有没有一种方法可以使用类名作为std::map的键?

C++ C++;-有没有一种方法可以使用类名作为std::map的键?,c++,C++,我试图使用类作为标准映射结构的键 用法如下所示 std::map<ClassName, int> someMap; someMap[ StudentClass ] someMap[ TeacherClass ] std::map someMap; someMap[学生课堂] someMap[教师课堂] 我将使用这个制作模板工厂类。它是某种特定于Microsoft的,但我认为您可以使用: std::map someMap; someMap[uuuuIdof(学生班)]=1; so

我试图使用类作为标准映射结构的键

用法如下所示

std::map<ClassName, int> someMap;

someMap[ StudentClass ]
someMap[ TeacherClass ]
std::map someMap;
someMap[学生课堂]
someMap[教师课堂]

我将使用这个制作模板工厂类。

它是某种特定于Microsoft的,但我认为您可以使用:

std::map someMap;
someMap[uuuuIdof(学生班)]=1;
someMap[u_uidof(TeacherClass)]=2;
someMap[u_uidof(ClassClass)]=3;

< >你可以用C++虚拟类变量或类似的方法来做这件事。

< P>你需要类名是人类可重命名的吗?如果没有,则可以使用
typeid
type\u info
。您可以使用
type_info::name()
()获取字符串,但请注意,它不能保证任何可读性或唯一性(但是
type_info
对象本身将是唯一的)。除此之外,您还必须依靠不可移植的机制或编写自己的代码来完成此操作。

最好使用,
typeid()
。它将为您提供跨类的唯一性。但是,您无法自动从typeid检索类类型

您可以使用typeid(SomeObject).name(),但它不能在编译器之间移植。如果您正在开发的是一个库或可移植代码,并且您确实需要一个可读的“类名”,那么您可以为每个类编写一个“元类”

template<typename T> class MetaClass{};
class Foobar {
//...
};
template<> class MetaClass<Foobar> {
public:
    static std::string className() {
        return "Foobar";
    }
};
std::map<std::string, int> someMap;
someMap[MetaClass<Foobar>::className()] = 0xff;
//...
模板类元类{};
福巴级{
//...
};
模板类元类{
公众:
静态std::string className(){
返回“Foobar”;
}
};
映射someMap;
someMap[MetaClass::className()]=0xff;
//...

如果您不喜欢模板,您可以用其他方式实现它,例如虚拟方法。

为什么不使用
typeid
std::type_info::name
?“不保证任何可读性”稍微低估了这个问题-它可以是简单的
[NUL]
,或者对于不同的类型也是一样的,这意味着为此目的使用它可能存在健壮性/可移植性问题。Tony是正确的,对
名称
提供的内容没有要求。要缓解这种情况,只需使用
type_info
本身作为键即可。它有一个
before
函数,它为类型提供了一个自然的排序。这个问题的可能重复项以各种形式不断出现。在过去的几个月里,我至少看过三次。
template<typename T> class MetaClass{};
class Foobar {
//...
};
template<> class MetaClass<Foobar> {
public:
    static std::string className() {
        return "Foobar";
    }
};
std::map<std::string, int> someMap;
someMap[MetaClass<Foobar>::className()] = 0xff;
//...