看来你已经找到了解决方案,但我会扩展一下。
你所呼吁的被称为Reflection
,即对象描述自身的能力。
大多数语言都可以借助元数据来实现反射。例如,在 Python 中,对象的函数和属性存储在字典元素中。
与 C# 或 Java 不同,C++ 没有任何本机反射系统,这会阻止(例如)这种自动打印/序列化或反序列化。
然而,C++ 具有非常强大的元编程支持,它允许我们(通过使用模板)模拟反射(在编译时)。这通常是使用完成的升压融合 http://www.boost.org/doc/libs/1_50_0/libs/fusion/doc/html/index.html,一个用于从编译时跨越到运行时的库。
正如您的链接中所示的示例,BOOST_FUSION_ADAPT_STRUCT http://www.boost.org/doc/libs/1_50_0/libs/fusion/doc/html/fusion/adapted/adapt_struct.html宏允许您采用标准struct
并为其提供被视为 Fusion.Sequence 所需的接口。
另一个例子是使用Fusion.Vector http://www.boost.org/doc/libs/1_50_0/libs/fusion/doc/html/fusion/container/vector.html or Fusion.Map http://www.boost.org/doc/libs/1_50_0/libs/fusion/doc/html/fusion/container/map.html存储类的属性,然后将此序列公开给自动打印/序列化/反序列化方法。
然而,这个系统有一个限制:元编程与面向对象编程不能很好地融合。
struct Base { char a; }; // Adapt
struct Derived: Base { char b; }; // Adapt
void print(Base const& b) { boost::fusion::for_each<Base>(b, Print()); }
只会打印以下成员Base
(here a
)。使用多态性时,需要使用virtual
某一点或另一点的方法:)