次の関数テンプレートは、指定したメンバへのポインタが配列型のメンバのものである場合、その要素数を返します。
0 1 2 3 4 5 6 |
template <typename T, typename C, std::size_t N> std::size_t member_count_of(T (C::*pm)[N]) { return N; } |
C++11以降であればconstexprを付ければ定数式に展開できますが、C++03までは定数式に展開できません。そこで、定数式に展開可能なテンプレートについても考えてみましょう。
0 1 2 3 |
template <typename T, typename C, std::size_t N> char (* member_count_type_of(T (C::*pm)[N]) )[N]; |
member_count_type_of関数テンプレートは関数原型しかありません。これを使って、
0 1 2 |
sizeof *member_count_type_of(&A::array) |
のようにしてやれば、メンバの要素数を定数式として取り出すことができます。