有没有一种方法可以使用类名作为std::map的键?
C++ - Is there a way that using Class name as a key of std::map?
我正在尝试使用类作为标准映射结构的关键
用法如下:
std::map<ClassName, int> someMap;
someMap[ StudentClass ]
someMap[ TeacherClass ]
我将使用这个制作模板工厂类
您需要类名是人类可读的吗?如果不是,那么可以使用typeid
和type_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;
//...
如果你不喜欢模板,你可以用其他方式实现它,例如虚拟方法
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如何使用 std::string 作为 QHash 的键?
- 使用 nullptr 作为 std::unordered_map 的键有什么后果吗?
- 找不到最新插入到 std::map 中的键
- 插入 std::set 作为 std::map 的键
- 如何使用用户定义的键控制和修改 std::map 排序
- 如何在std::map中找到所有具有最大值C++的键
- 计算表达式字符串由 std::map 中的键组成
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- 将向量作为值分配给 std::unordered_map 中的键
- 为什么我可以将 std::map 的键传递给一个期望非常量的函数?
- std::在地图上查找无法正常工作并循环访问地图的键和值
- 在std :: Map或std :: set中找到具有给定前缀的键的优雅方法
- 当请求的键丢失时,有没有办法从向量映射返回 std::vector ref?
- 使用多态类的 std::unique_ptr 作为 std::unordered_map 中的键
- 可变参数模板包作为 std::unordered_map 的键
- 使用 protobuf 对象作为 std::map 中的键
- 如何使用可变参数模板作为 std::type_index 地图的键
- 如何在三维数组中使用std::map来存储/检索具有特定值的键