2012-02-22 141 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++頂層的紙薄層)。編譯器也不需要這樣做 - 也就是說,它不需要推斷名稱的成員。它只知道對象地址和每個成員的類型的內存偏移量,並通過調用它們的構造函數將它們複製到目標對象。