2012-02-22 3 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

+0

@luskan:アイデアは、各メンバをコピーするのではなく、各メンバに任意の関数 'g'を呼び出すことです。 –

+1

いいえ、残念なことに、自分で定義したときにデフォルトのコピーコンストラクタの機能を取り戻すことはできません –

答えて

5

コンパイラには、各クラスを表す内部データ構造がいくつかあります。コピーコンストラクタを合成する際には、どの構造体をどのくらいの数のコードを発行する必要があるのか​​を把握するために、この構造体を参照することができます。および宛先オブジェクトのアドレス)。

単なるC++プログラマとして、あなたはこの内部コンパイル時のデータ構造にアクセスすることができないので、あなたはかなり不運です。あなたは基本的にメンバーをリストアップし、あなたが何も出てこないことを願っています。

あなたは、おそらくあなたは、各メンバーのために1つのコールのリストを生成するために使用することができ、余分な情報を使って構造体の定義に注釈を付けるために、(その後、あるいはそうでない場合はプリプロセッサプリプロセッサ)プリプロセッサでは動作しませんでした。

0

いいえ、できません。 C++にはmethod reflectionがありませんが、Qtのようなフレームワーク内で作業することでこれを行うことができます。 (これは素晴らしいフレームワークですが、私はいつも使っており、C++の上に紙の薄い層しか提供していません)。コンパイラはこれを行う必要もありません。つまり、メンバーのの名前を推測してください。オブジェクトのアドレスと各メンバの型からのメモリオフセットを知っているだけで、コンストラクタを呼び出すことによってそれらをターゲットオブジェクトにコピーします。

関連する問題