C++ 如何使用命名的字段漂亮地打印结构?

C++ 如何使用命名的字段漂亮地打印结构?,c++,reflection,pretty-print,C++,Reflection,Pretty Print,假设我有一个 struct foo { int bar; double baz; }; 和一个structfoos某处。我希望能够编写magic(s)并将字符串或文本打印到cout,其中不仅包括s.bar和s.baz的值,还包括标识符“bar”和“baz” 我知道C++没有正确的反映,但可能是RTTIish(我不太精通RTTI)吗?或者是对班级宣言稍加修饰 注意:当然,我问的是一个解决方案,它适用于任何类型,或者至少适用于任何结构;显然,我可以实现一个操作符您可以实现: inline std:

假设我有一个

struct foo { int bar; double baz; };
和一个
structfoos某处。我希望能够编写
magic(s)
并将字符串或文本打印到cout,其中不仅包括s.bar和s.baz的值,还包括标识符“bar”和“baz”

我知道C++没有正确的反映,但可能是RTTIish(我不太精通RTTI)吗?或者是对班级宣言稍加修饰

注意:当然,我问的是一个解决方案,它适用于任何类型,或者至少适用于任何结构;显然,我可以实现一个
操作符您可以实现:

inline std::ostream& operator<<(
        std::ostream& os, // stream object
        const foo& f
    )
    {
        os << /*ToDo - nice formatting of data members*/
        return os;
    }

<代码>内嵌STD::Orths&运算符

我们可能不得不等待直到C++获得了添加到语言的反射设施。

WG21 SG7正在积极开展这方面的工作。那是什么?是开发C++语言标准的(ISO)工作组。SG7是负责探索反射可能性的小组


SG7有一个讨论其正在进行的工作的文档。

二进制文件中没有变量名。你需要更广泛的东西,伊姆霍。@SouravGhosh:1。我说的是字段名,不是变量名,还有2。你是对的,但是二进制可能有调试符号;或者,这是最有可能的一种情况,如果一个解决方案(如果存在的话)在C和C++之间会有所不同。删除其中一个标记。@BaummitAugen:是的,我想你是对的。不幸的是,大多数反射功能还没有标准化,但有趣的是,当前针对C++1z的反射方案确实允许你迭代类成员。显然,我不想对我声明的每种可能的类型实现这一点……显然?你需要多少类型的这个?!你也必须自己用Java实现这个等价物。有多少个?都是。重点不是写这段代码。好吧,1。按我的方式做,2。换成Java,3。构建一个自动生成代码的自定义构建步骤。@einpoklum更正Bathsheba关于Java的观点-你可以改为Rust。这是新的C++,有一种方法来打印结构。