我正在研究 C++11 中的类型描述符项目。类型描述符的工作是了解类中每个成员的类型、它的大小以及它与对象基础的偏移量。我不支持多重继承以及具有虚拟方法的对象,所以我现在让它变得更简单。目标是能够使用描述符序列化和反序列化对象。
请注意,这是一个宠物项目,用于处理可变参数模板、指向成员的指针和我不熟悉的 C++ 的其他功能等功能,因此无需将我指向 boost::archiving 之类的东西。:)
我实际注册成员的方式与 boost::python::class_ 的方式非常相似。
ClassDescriptor fooDesc( "Foo" );
fooDesc.addMember( "a", &Foo:: a );
fooDesc.addMember( "b", &Foo:: b );
// (abridged for clarity) :
template< typename ClassType, typename MemberType >
ClassDescriptor& ClassDescriptor::addMember(
const char* name,
MemberType ClassType::* member
)
{
return addMember< MemberType >( name, reinterpret_cast< size_t >( &(((ClassType*)0)->*member)) );
}
不幸的是,C++ 的指针指向成员特性不能与 C++ 中的引用一起使用,正如我本周早些时候了解到的那样:https ://stackoverflow.com/a/8336479/1074536 ,所以我不能以 &Foo::refToAndInt 为例。
至于我如何计算成员的偏移量,我没有使用宏的偏移量,因为我的类并不总是 POD。
因此,由于我不能使用指向成员的指针来计算引用的偏移量,所以我想我会尝试:
&(((Foo*)nullptr)->refToAnInt)
但是否已在另一个堆栈溢出线程中指出,这是未定义的行为,显然在 LLVM 上它会崩溃。:(
我想避免做一些事情,比如获取前一个成员的偏移量,添加它的大小,然后以某种方式计算对齐我的下一个成员所需的填充,因为它看起来很混乱并且容易出错
所以,我不能同时使用这两种技巧,并且 offsetof 仅适用于 POD。除了我的其他可怕建议之外,关于我下一步可以尝试什么的任何建议?
谢谢!