Voglio creare una struttura che assegna staticamente una serie di 2^N byte, ma non voglio che gli utenti di questa struttura specificino questa dimensione come esponente. Esempio:Come faccio a verificare se un parametro template è una potenza di due?
my_stupid_array<char, 32> a1; // I want this!
my_stupid_array<char, 5> a2; // And not this...
Come si controlla se questo parametro modello è una potenza di due e avvertire l'utente con un bel messaggio di questo?
Sono stato in grado di verificare la presenza di questo con un semplice modello:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
};
Tuttavia, sono in grado di avvertire l'utente di questo con un messaggio sano. Qualche idea?
EDIT
fissa l'esempio ambiguo.
EDIT
1 è una potenza di due effetti. Risolto il problema! :)
EDIT
Utilizzando BOOST_STATIC_ASSERT, sto ottenendo questo errore di compilazione per questo codice con GCC:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
BOOST_STATIC_ASSERT(val);
};
errore
..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
EDIT
Oh, ho capito. Quello era il messaggio che dovrei ottenere quando l'asserzione fallisce. Ma questo non riesce a dare all'utente un messaggio sensato.:(
8 è una potenza di 2 ... –
È inteso come un esempio di esponente come parametro. 2^8 = 256 – jrok
> 'my_stupid_array a2; // E non questo ... 'perché non questo? –
triclosan