pointers_to_members
C++ 固有の仕様
クラスを定義する前にそのクラスのメンバーへのポインターを宣言できるかどうか、また宣言したポインターを使用してポインターのサイズおよびポインターの解釈に必要なコードを制御するかどうかを指定します。
#pragma pointers_to_members( pointer-declaration, [most-general-representation] )
解説
pointers_to_members プラグマは、ソース ファイル内に /vmx コンパイラ オプションまたは継承キーワードを使用する代わりとして指定できます。
pointer-declaration 引数は、関連付けられた関数定義の前または後にメンバーへのポインターを宣言したかどうかを指定します。 pointer-declaration 引数は、次の 2 つのシンボルのいずれかです。
引数 |
コメント |
---|---|
full_generality |
安全な、場合によっては最適でないコードです。 関連付けられたクラス定義の前にメンバーへのポインターを宣言した場合は、full_generality を使用します。 この引数では、most-general-representation 引数によって指定されたポインター表現が常に使用されます。 これは /vmg と同じです。 |
best_case |
メンバーへのすべてのポインターに対し、最適な表現を使用した安全で最適なコードを生成します。 クラスのメンバーへのポインターを宣言する前に、クラスを定義する必要があります。 既定値は best_case です。 |
most-general-representation 引数は、コンパイラが、翻訳単位内にあるクラス メンバーへの任意のポインターを参照するために安全に使用できる最小のポインター表現を指定します。 引数は以下のいずれかになります。
引数 |
コメント |
---|---|
single_inheritance |
最も一般的な表現は、単一継承、メンバー関数へのポインターです。 メンバーへのポインターが宣言されているクラス定義の継承モデルが多重継承モデルまたは仮想モデルの場合、エラーが発生します。 |
multiple_inheritance |
最も一般的な表現は、多重継承、メンバー関数へのポインターです。 メンバーへのポインターが宣言されているクラス定義の継承モデルが仮想モデルの場合、エラーが発生します。 |
virtual_inheritance |
最も一般的な表現は、仮想継承、メンバー関数へのポインターです。 エラーが発生することはありません。 これは、#pragma pointers_to_members(full_generality) を使用した場合の既定の引数です。 |
注意
pointers_to_members プラグマは、影響を与えるソース コード ファイル内のみに指定し、必ず #include ディレクティブの後に配置することをお勧めします。これにより、プラグマが他のファイルに影響を与えるリスクが減少すると共に、同じ変数、関数、またはクラス名に誤って複数の定義を指定するリスクが減少します。
使用例
// Specify single-inheritance only
#pragma pointers_to_members( full_generality, single_inheritance )