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>' 

http://ideone.com/cMfEf

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. :(

Antworten auf die Frage(3)

Ihre Antwort auf die Frage