将对象的公共内容输出到人类可读文件的最佳方法是什么?我正在寻找一种方法来做这个,不需要我知道该类的所有成员,而是使用编译器告诉我存在什么成员,以及他们的名字是什么。必须有宏或类似的东西,对吧?
受挫的例子:
class Container
{
public:
Container::Container() {/*initialize members*/};
int stuff;
int otherStuff;
};
Container myCollection;
我希望能够做一些事情来看看“myCollection:stuff = value,otherStuff = value”的输出。 但是如果另一个成员被添加到Container,
class Container
{
public:
Container::Container() {/*initialize members*/};
int stuff;
string evenMoreStuff;
int otherStuff;
};
Container myCollection;
这次,这个快照的输出将是“myCollection:stuff = value,evenMoreStuff = value,otherStuff = value”
是否有可以帮助我完成此操作的宏?这甚至可能吗? (另外,我无法修改Container类。) 另一个注意事项:我对VS中的潜在宏感兴趣,但也欢迎其他解决方案。
答案 0 :(得分:2)
您正在寻找的是“[反思](http://en.wikipedia.org/wiki/Reflection_(computer_science)#C.2B.2B)”。
我找到了两个有希望的链接,谷歌搜索“C ++反射”:
答案 1 :(得分:2)
Boost有一个序列化库,可以序列化为文本文件。但是,您现在无法知道该类包含哪些成员。你需要反思,C ++没有。
答案 2 :(得分:1)
看看this library。
答案 3 :(得分:1)
您需要的是对象序列化或对象编组。 stackoverflow中的recurrent thema。
答案 4 :(得分:1)
我强烈建议您查看Google的Protocol Buffers。
答案 5 :(得分:0)
遗憾的是,没有宏可以为您做到这一点。您正在寻找的是反射型库。这些可以从相当简单到家庭卷制的怪物变化,在工作环境中没有地位。
没有真正简单的方法可以做到这一点,虽然你可能只想把内存转储到这样的地址:
char *buffer = new char[sizeof(Container)];
memcpy(buffer, containerInstance, sizeof(Container));
我真的建议反对它,除非你所拥有的都是简单的类型。
如果你想要一些非常简单但不完整的东西,我建议你自己编写
printOn(ostream &)
成员方法。
答案 6 :(得分:0)
XDR是以独立于平台的方式实现此目的的一种方式。