メタプログラミング手法を使用してコンパイル時のビットマスクを作成しようとしています。私の考えは、次のようなものを作成することです。
unsigned int Mask3 = Mask<2>(); // value = 0x03 = b00000000000000000000000000000011
unsigned int Mask3 = Mask<3>(); // value = 0x07 = b00000000000000000000000000000111
unsigned int Mask3 = Mask<7>(); // value = 0x7F = b00000000000000000000000001111111
私が試しているコードは次のとおりです。
template <const unsigned int N> const unsigned int Mask()
{
if (N <= 1)
{
return 1;
}
else
{
return ((1 << N) | Mask<N - 1>());
}
}
1を返します。
しかし、それは警告のトンのペアになります:
- 警告C4554:'<<':演算子の優先順位をチェックしてエラーの可能性を確認してください
- 警告C4293:'<<':シフトカウントが負または大きすぎる
そして最後に、コンパイルエラー:
- エラーC1202:再帰型または関数依存性コンテキストが複雑すぎます。
したがって、再帰が終了せず、コンパイラの無限ループに陥ることはないと推測しますが、その理由がわかりません。