今回は、与えられた値が2の累乗(べき乗)かどうかを判定する処理を作ってみます。
まずは整数定数式に対して静的に判定を行うためのメタ関数を定義してみましょう。
0 1 2 3 4 5 6 |
template <unsigned N> struct is_power_of_2 { static const bool value = (((N - 1U) & N) == 0) && N > 0; }; |
例によってC++98以降で使えるように書いています。Nの型はunsigned型に固定していますが、もうひとつテンプレート引数を増やして、Nの型もテンプレートにしてもよいでしょう。
次に、普通の関数も定義しておくことにしましょう。
0 1 2 3 4 5 6 |
template <typename T> bool is_power_of_2(T value) { return (((value - 1U) & value) == 0) && value > 0; } |
こちらもC++98以降で使えますが、C++11以降であれば、constexprを付けることで、整数定数式を実引数に与えたときに静的に結果を求めることができるようになります。