Wie überprüfe ich, ob ein Vorlagenparameter eine Zweierpotenz ist?
Ich möchte eine Struktur erstellen, die ein Array von statisch zuordnet2 ^ N BytesIch möchte jedoch nicht, dass die Benutzer dieser Struktur diese Größe als Exponenten angeben. Beispiel:
my_stupid_array<char, 32> a1; // I want this!
my_stupid_array<char, 5> a2; // And not this...
Wie überprüfe ich, ob dieser Vorlagenparameter eine Zweierpotenz ist?und den Benutzer mit einer netten Nachricht darüber warnen?
Ich konnte dies mit einer einfachen Vorlage überprüfen:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
};
Ich kann den Benutzer jedoch nicht mit einer vernünftigen Meldung darauf hinweisen. Irgendwelche Ideen?
BEARBEITEN
Das mehrdeutige Beispiel wurde behoben.
BEARBEITEN
1 ist in der Tat eine Zweierpotenz. Das wurde behoben! :)
BEARBEITEN
Wenn ich BOOST_STATIC_ASSERT verwende, erhalte ich diesen Kompilierungsfehler 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);
};
Error
..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
BEARBEITEN
Oh ich verstehe. Das war die Nachricht, die ich erhalten sollte, wenn die Behauptung fehlschlägt. Aber das gibt dem Benutzer keine vernünftige Botschaft. :(