2012-02-22 104 views
0

由编译器合成的默认拷贝构造函数为 未定义自己的类做了正确的事情:它将 所有成员从一个对象复制到另一个对象。C++编译器如何合成默认拷贝构造函数

我想做类似的事情。我想写一个方法

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

如果它是一个POD那么为什么不使用memcpy? – marcinj 2012-02-22 16:09:08

+0

@luskan:想法是在每个成员上调用一个任意函数'g',而不是复制每个成员。 – 2012-02-22 16:16:20

+1

不,在您定义自己的时候,不可能重新获得默认拷贝构造函数的功能,遗憾的是 – 2012-02-22 16:17:45

回答

5

编译器有一些代表每个类的内部数据结构。当涉及到综合复制构造函数时,它可以引用这个结构,以便找出它需要发出的代码(多少个副本,每个副本是如何完成的,以及成员的地址与源相关的地址和目标对象地址)。

作为单纯的C++程序员,您无法访问此内部编译时数据结构,因此您几乎没有运气。你基本上必须列出成员,并希望你不要离开。

也许你可以做的预处理工作(或者如果不预处理然后一个预处理器),标注与您可以用它来生成一个呼叫为每个成员的名单额外信息的结构定义。

0

不,你不能这样做。 C++没有method reflection,尽管你可以通过在像Qt这样的框架内工作。 (btw是一个很好的框架,我一直都在使用它,它只提供C++顶层的纸薄层)。编译器也不需要这样做 - 也就是说,它不需要推断名称的成员。它只知道对象地址和每个成员的类型的内存偏移量,并通过调用它们的构造函数将它们复制到目标对象。