我如何漂亮地打印一个结构,其字段被命名?
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 讨论其正在进行的工作。
假设我有一个
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 讨论其正在进行的工作。