我如何漂亮地打印一个结构,其字段被命名?

How can I pretty-print a struct with its fields being named?

假设我有一个

struct foo { int bar; double baz; };

还有一个 struct foo s; 某处。我希望能够编写 magic(s) 并得到一个字符串,或者打印到 cout 的文本,其中不仅包括 s.bar 和 s.baz 的值,还包括标识符 'bar' 和 'baz'.

我知道 C++ 没有适当的反射,但也许有些 RTTIish(我不精通 RTTI)?或者也许对 class 声明进行一些小修饰?

注意:当然,我问的是适用于任何类型或至少适用于任何结构的解决方案;显然我可以为 foo 实现 operator<<

您可以实施:

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

然后这将适用于 cout 等:

foo f; cout << "My foo is " << f << ".";

我们可能不得不等到 C++ 将反射功能添加到语言中。

WG21 SG7 正在积极开展这项工作。那是什么? WG21 is the working group of the International Standards Organization (ISO) 开发 C++ 语言标准。 SG7 是负责探索可能性反思的小组。

SG7 有一个 Google Group 讨论其正在进行的工作。