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

C++结构中所有字段的打印值,c++,visual-c++,structure,C++,Visual C++,Structure,考虑一个简单的结构: struct abc { int a; char b; } 我在定义为其结构的变量中得到了一些值,现在我想打印以下内容 *a = [some value] b = [some character]* 对于任意结构,不必编写转储,实现这一点的最佳方法是什么。。。。。。我遇到的每个结构的函数?没有一个,不是C++。不幸的是, 如果你在.NET中使用C++,你可以使用这些东西来查看结构的内层。但是,非托管C++很少存储关于对象的元数据。

考虑一个简单的结构:

struct abc  
{  
    int a;  
    char b;  
}  
我在定义为其结构的变量中得到了一些值,现在我想打印以下内容

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

对于任意结构,不必编写转储,实现这一点的最佳方法是什么。。。。。。我遇到的每个结构的函数?

没有一个,不是C++。不幸的是,

如果你在.NET中使用C++,你可以使用这些东西来查看结构的内层。但是,非托管C++很少存储关于对象的元数据。

需要进行反射。在C++中没有本地提供反射,或者只针对最小信息类型IDS /名称。


有这样的库可以实现反射功能,因此如果您确实需要反射,您应该使用反射功能。

您似乎已经找到了解决方案,但我将进行一些扩展

你所要求的是反射,即物体描述自身的能力

由于元数据,大多数语言都可以实现反射。例如,在Python中,对象的函数和属性存储在dictionary元素中

与C或Java不同,C++没有任何本机反射系统,例如,它阻止了这种自动打印/序列化或反序列化

但是,C++有非常强大的元编程支持,它允许我们通过使用模板来模拟编译时的反射。这通常是使用一个用于从编译时过渡到运行时的库来完成的

正如链接中的示例所示,宏允许您获取标准结构,并为其提供所需的接口,以将其视为Fusion.Sequence

另一个示例是使用或存储类的属性,然后将此序列公开给自动打印/序列化/反序列化方法

然而,这个系统有一个局限性:元编程与面向对象编程不能很好地结合

struct Base { char a; };            // Adapt
struct Derived: Base { char b; };   // Adapt

void print(Base const& b) { boost::fusion::for_each<Base>(b, Print()); }

将仅在此处打印Base a的成员。当使用多态性时,您需要在某一点或另一点上使用虚拟方法:

使用C++17,甚至可能是C++14,以及一些疯狂的俄罗斯黑客——这可以部分完成。也就是说,您可以按顺序打印类型值,但无法获取字段名

相关的图书馆是Antony Polukhin的。具体地说,它为每个字段迭代提供了一个参数,该迭代采用具有自动参数类型的模板化lambda。例如:

struct simple {
    int a;
    char b;
    short d;
};

simple x {42, 'a', 3};
std::stringstream ss;

boost::pfr::for_each_field(
    x,
    [&ss](auto&& val) {
        ss << val << ' ';
    }
);
答案从一个相关/重复的问题迁移而来——因为不知何故,这里没有人提到这一点。

就这样做吧

#include<iostream>
using namespace std;
struct abc  
{  
    int a;  
    char b;  
};
void display(abc myStruct){
   cout << "struct abc {"<< endl;
   cout << abc.a << endl;
   cout << abc.b << endl;
   cout << "}" << endl;
}
int main(){
    abc myStruct
    display(myStruct);
}

只有当结构是用户定义的,而不是您自己定义的,并且您不确定结构的内部结构时,才需要进行反射。

好吧,在写了这个问题之后,我随机在谷歌上搜索,发现下面的讨论我想回答了我所有的疑问。谢谢大家的回答。有多种方法可以做到这一点:模板元编程、解析或使用外部工具生成类。别忘了,计算机有很多东西是可以实现的,尽管可能不容易实现,也可能不以你认为应该的方式实现。反思正在进入标准。这个答案现在过时了。我喜欢fusion.adapt.struct解决方案。