由编译器合成的默认复制构造函数 一个没有定义自己的类是正确的:它复制 所有成员从一个对象到另一个对象。
我想做类似的事情。我想写一个方法
template <typename T>
T f(const T& obj) {
// for each member var i of obj, I want to call some method g(obj.i)
}
现在我不知道成员变量的名称是什么。如果是的话 复制构造函数,我可以调用赋值运算符而不是g。
显然,编译器会这样做(但也许它会在推断之后执行此操作 班级成员的名字)。甚至可以做到这一点 对于任何一类T?
答案 0 :(得分:5)
编译器有一些代表每个类的内部数据结构。在合成复制构造函数时,它可以参考这个结构,以便弄清楚它需要发出什么代码(多少个副本,每个副本如何完成,以及成员的地址与源相关的内容)和目标对象地址)。
作为一名C ++程序员,您无权访问此内部编译时数据结构,因此您运气不佳。您基本上必须列出成员,并希望您不要遗漏任何内容。
您也许可以使用预处理器(或者如果不是 预处理器,然后 a 预处理器),使用可用于生成的额外信息来注释结构定义每个成员的一个电话清单。
答案 1 :(得分:0)
不,你不能这样做。 C ++没有method reflection,但你可以通过在像Qt这样的框架中工作来实现。 (哪个btw是一个很好的框架,我一直使用它,它只提供了一个在C ++之上的纸上薄层。)编译器也不需要这样做 - 也就是说,它不需要推断成员的名称。它只知道对象地址的内存偏移量和每个成员的类型,并通过调用它们的构造函数将它们复制到目标对象。