打印 C++ 结构中所有字段的值

2024-01-06

考虑一个简单的结构:

struct abc  
{  
    int a;  
    char b;  
}  

我在定义为其结构的变量中获得了一些值,现在我想打印以下内容。

*a = [some value]  
b = [some character]*

对于任意结构实现此目的的最佳方法是什么,而无需为我遇到的每个结构编写转储...(...) 函数?


看来你已经找到了解决方案,但我会扩展一下。

你所呼吁的被称为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某一点或另一点的方法:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打印 C++ 结构中所有字段的值 的相关文章

随机推荐