4.2 構造体メンバのサイズを返す。

まずは素直に作った関数テンプレートからです。

template<class T, class C>
std::size_t member_size_of(T (C::*pm))
{
  return sizeof(T);
}

インライン展開されれば定数値になると思いますが、残念なことに文法上は定数式ではありませんので、定数式が要求される文脈では使用することができません。そこで、

template<class T, class C>
T member_type_of(T (C::*pm));

のように、メンバの型と同じ型の返却値を持つ関数テンプレートを宣言し(関数原型だけでかまいません。関数本体の定義は不要です。)、

sizeof member_type_of(&A::a)

のような使い方をしてやれば、定数式としてメンバのサイズを取得することができます。このように、C++では、本体の定義がない関数原型だけの関数であっても利用価値があります。


元ネタ
このエントリーを含むはてなブックマーク