C++中的普通数据(POD)没有运行时类型信息。所描述的所有类都占用恰好1个字节,并且在任何具有空基类优化的编译器中具有相同的运行时表示。
因此,您想要的是无法实现的。
向基类添加虚析构函数会添加RTTI和dynamic_cast
支持。
向基类添加一个在每个派生类中以不同方式初始化的enum
或int
字段也可以起到作用。
另一种选择是创建一个模板函数,并存储指向它的指针,如下所示:
using my_type_id=void(*)();
template<class>void get_my_type_id_helper(){};
template<class T> my_type_id get_my_type_id(){return get_my_type_id_helper<T>;}
然后将适当初始化的my_type_id
存储在A
中。这是重新发明RTTI,随着您需要更多功能,您会接近C++ RTTI开销。
在C ++中,您只支付您要求的:您可以请求没有RTTI的类,并获得它。
RTTI是运行时类型信息。POD是C ++ 03术语,指纯粹的旧数据。许多类不是POD:最简单的方法是添加虚拟析构函数。C ++ 11具有更精细的标准布局和聚合术语。
从技术上讲,RTTI和POD并不是彼此的对立物:有些没有RTTI的类不是POD。
请注意,MSVC有选项可以不生成RTTI,并且其激进的Comdat折叠可能会破坏我上面做的手动RTTI,在两种情况下都违反了标准。
dynamic_cast<>
吗?这并不是特定于 C++11 的语法。 - πάντα ῥεῖA
是一个“基类”,它应该有一个虚析构函数。不管怎样,这听起来像是一个XY问题。很可能你可以通过使用虚函数来完全避免使用switch
语句。 - Captain Obvlious