【问题标题】:How can I pretty-print a struct with its fields being named?我怎样才能漂亮地打印一个结构,它的字段被命名?
【发布时间】:2015-07-21 13:16:58
【问题描述】:

假设我有一个

struct foo { int bar; double baz; };

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

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

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

【问题讨论】:

  • 二进制文件中不存在变量名。你需要更广泛的东西,恕我直言。
  • @SouravGhosh:1. 我说的是字段名,不是变量名,还有 2. 你说得对,但二进制文件可能有调试符号;或其他类型的仪器。
  • 此外,这很可能是 C 和 C++ 之间的解决方案(如果存在)不同的情况。删除其中一个标签。
  • @BaummitAugen:是的,我想你是对的。
  • 不幸的是,大多数反射特性尚未标准化,但有趣的是,当前 C++1z 的反射提议确实允许您迭代类成员。

标签: c++ reflection pretty-print


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你可以实现:

    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 &lt;&lt; "My foo is " &lt;&lt; f &lt;&lt; ".";

    【讨论】:

    • 显然我不想为我声明的每一种可能的类型都实现它...
    • 显然?你需要多少种?!您也必须自己在 Java 中实现等价物。
    • 多少?他们都是。重点不是写这段代码。
    • 好吧,1. 按我的方式做,2. 改用 Java,3. 构建一个自动生成代码的自定义构建步骤。
    • @einpoklum 更正了 Bathsheba 关于 Java 的观点——你可以改用 Rust。它是新的 C++,并且有一种打印结构的方法。
    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多