Como faço para verificar se um parâmetro de modelo é uma potência de dois?
Eu quero criar uma estrutura que aloca estaticamente uma matriz de2 ^ N bytes, mas não quero que os usuários dessa estrutura especifiquem esse tamanho como o expoente. Exemplo:
my_stupid_array<char, 32> a1; // I want this!
my_stupid_array<char, 5> a2; // And not this...
Como posso verificar se esse parâmetro de modelo é uma potência de doise avisar o usuário com uma mensagem legal sobre isso?
Eu consegui verificar isso com um modelo simples:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
};
No entanto, não posso avisar o usuário sobre isso com uma mensagem sã. Alguma ideia?
EDITAR
Corrigido o exemplo ambíguo.
EDITAR
1 é um poder de dois, de fato. Corrigido isso! :)
EDITAR
Usando o BOOST_STATIC_ASSERT, estou recebendo este erro de compilação para este código com o GCC:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
BOOST_STATIC_ASSERT(val);
};
Erro
..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
EDITAR
Oh, entendi. Essa foi a mensagem que eu deveria receber quando a afirmação falhar. Mas isso não dá ao usuário uma mensagem sensata. :(