はい、このコードは有効であり、混乱の原因は実際にはテンプレートに関連していません。
int X::*
メンバーへのポインター (具体的には、int
type のデータ メンバーへのポインターX
) です。ポインター自体はオブジェクトのインスタンスを伝達しないため、実際に非静的メンバーへのポインターを取得できます。(実際、静的メンバーへのポインターは、メンバーへのポインターではなく、通常のポインターになります!)
オブジェクト インスタンスは、ポインターを取得するときではなく、ポインターを使用するときに指定します。
// Declare a pointer to a data member of type int on object of type X, and
// initialize it to point to the X::n member.
int X::*ptr = &X::n;
// *ptr is not valid on member pointers. Rather, we need to supply an instance:
X instance;
// Then use the member pointer dereference operator .*
(instance.*ptr) = 5; // Same as "instance.n = 5;" in this case.