これはマクロを作るのが一番簡単かもしれません。
元ネタでは、
0 1 2 |
#define MemberSizeOf(type, member) sizeof(((type*)0)->member) |
のようになっていましたが、C++では
0 1 2 |
#define member_size_of(type, member) sizeof(type::member) |
でよさそうです。ただ、typeがCV修飾されているとエラーになるので、元ネタのままの方がよさそうです。
あえてテンプレートにするのであれば、次のようにすればOKです。
0 1 2 3 4 5 6 |
template <typename T, typename C> std::size_t member_size_of(T (C::*pm)) { return sizeof(T); } |
C++11以降であればconstexprを付ければ大丈夫ですが、C++03までは定数式にならないという問題が発生します。そこで、
0 1 2 3 |
template <typename T, typename C> T member_type_of(T (C::*pm)); |
のように、メンバの型と同じ型の返却値を持つ関数テンプレートを宣言し(関数原型だけでかまいません。関数本体の定義は不要です)、
0 1 2 |
sizeof member_type_of(&A::a) |
のような使い方をしてやれば、定数式としてメンバのサイズを取得することができます。このように、C++では、本体の定義がない関数原型だけの関数であっても利用価値があります。
ただ、よくよく考えると元ネタのマクロが一番よさそうです。何でもかんでもテンプレートにすればいいというものではありません。