Ich möchte eine Struktur erstellen, die statisch ein Array von 2^N Bytes zuweist, aber ich möchte nicht, dass die Benutzer dieser Struktur diese Größe als Exponent angeben. Beispiel:Wie überprüfe ich, ob ein Template-Parameter eine Potenz von zwei ist?
my_stupid_array<char, 32> a1; // I want this!
my_stupid_array<char, 5> a2; // And not this...
Wie kann ich überprüfen, ob diese Template-Parameter eine Zweierpotenz ist und warn der Benutzer mit einer schönen Nachricht über diese?
Ich habe in der Lage gewesen, dies mit einer einfachen Vorlage zu überprüfen:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
};
Aber ich bin nicht in der Lage die Benutzer über diese mit einer gesunden Nachricht zu warnen. Irgendwelche Ideen?
EDIT
die zweideutige Beispiel behoben.
EDIT
1 ist eine Potenz von zwei in der Tat. Das wurde behoben! :)
EDIT
Mit BOOST_STATIC_ASSERT, erhalte ich diesen Compiler-Fehler für diesen Code mit GCC:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
BOOST_STATIC_ASSERT(val);
};
Fehler
..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
EDIT
Oh, ich verstehe. Das war die Nachricht, die ich bekommen sollte, wenn die Assert fehlschlägt. Aber das gibt dem Benutzer keine vernünftige Nachricht.:(
8 ist eine Potenz von 2 ... –
Es ist als Beispiel für den Exponenten als Parameter gedacht. 2^8 = 256 – jrok
> 'my_stupid_array a2; // Und nicht das ... 'warum nicht das? –
triclosan