说我有一个Foo类,及其子类Bar1,Bar2和Bar3。子类可能会添加额外的字段。
实际上,我希望sizeof()
适用于Foo *,无论它是基类还是任何子类的对象。
很明显,我可以制作自己的SizeOf()
方法,并要求所有子类(添加字段)重写此方法以返回更新的SizeOf()
。但这不是很漂亮,它需要工作,并且如果您忘记重写该方法,或者覆盖但意外地具有错误的sizeof()
,则可能会导致混淆的bug。 (例如,实现Bar2::Sizeof() { return sizeof( Foo ); }
)。有没有更好的方法?
我希望为此项目使用C ++ 17,但是希望对任何C ++版本的讨论都感兴趣。
据我所知,如果对象的动态类型给出基本指针,则没有直接获取大小的方法。
您可以创建一个从std::type_index
到该大小的关联映射,并使用typeid
从基本指针获取std::type_index
。剩下的工作是确保将每个派生类型添加到地图。
最小化每个类工作量的方法是创建一个类模板,该类模板具有一个静态成员,该成员具有一个构造函数,该构造函数将参数类型添加到映射中。这样,程序员在创建新的派生类型以支持此功能时所要记住的就是用新类型作为模板参数实例化该模板。