web-dev-qa-db-ja.com

テンプレートパラメータとしてのクラスメンバーへのポインタ

実際にはクラスメンバーへのポインタである非型テンプレートパラメータを持つことは可能ですか?私が探しているのは次のようなものです。

struct Person {
  Dog dog;
};

template <?? ptr>
struct Strange {
  // ...
};

typedef Strange<&Person::dog> weird;

これまでの私の仕事は、そのようなことは何も不可能であると私に信じさせますが、誰かが他のことを言うことができるかどうか私は興味があります。

31

標準から:

非型テンプレートパラメータは、次の(オプションでcv修飾された)型のいずれかを持つ必要があります。

  • 整数型または列挙型、
  • オブジェクトへのポインタまたは関数へのポインタ、
  • オブジェクトへの参照または関数への参照、
  • メンバーへのポインタ

したがって、これは許可されており、次のようにg++で機能するようです。

template <Dog Person::*ptr>
struct Strange { ... };
42
hammar