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

C++ - Is there a way that using Class name as a key of std::map?

本文关键字:std 的键 map 一种 可以使 方法 有没有      更新时间:2023-10-16

我正在尝试使用类作为标准映射结构的关键

用法如下:

std::map<ClassName, int> someMap;
someMap[ StudentClass ]
someMap[ TeacherClass ]

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

您需要类名是人类可读的吗?如果不是,那么可以使用typeidtype_info。您可以获得带有type_info::name()(细节)的字符串,但请注意,不能保证它是可读的,甚至是唯一的(然而,type_info对象本身将是唯一的)。除此之外,您将不得不依赖不可移植的机制或编写自己的代码来完成此操作。

最好使用typeid()。它会给你跨类的唯一性。但是,您不能自动从typeid检索类类型。

这是微软特有的,但我认为你可以使用__uuidof:

std::map<GUID, int> someMap;
someMap[__uuidof(StudentClass)] = 1;
someMap[__uuidof(TeacherClass)] = 2;
someMap[__uuidof(ClassClass)] = 3;

可能有一个更好的方法,你可以使用c++虚拟类变量或类似的东西来做到这一点。

您可以使用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;
//...

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