Ich erstelle eine variadische Vorlage.
Sagen wir, ich habe so etwas:
Instanzen dieser Klasse können wie folgt instanziiert werden:
%Vor% Ich möchte sicherstellen, dass zur Kompilierungszeit mit static_assert
sichergestellt wird, dass das Parameterpaket numbers
nur bestimmte Zahlen enthält. Für dieses Beispiel möchte ich sagen, dass ich nur 0
oder 1
zulassen möchte.
Also würde ich gerne etwas tun wie:
%Vor% Aber offensichtlich funktioniert static_assert
nicht mit einer for
Schleife. Ich bin mir ziemlich sicher, dass es eine Art von Syntax dafür geben muss, aber ich konnte es nicht herausfinden.
Ich würde lieber etwas verwenden, das mit einem C ++ 11-Compiler kompiliert (oder vielleicht ein C ++ 14-Compiler, wenn es in C ++ 11 nicht machbar ist).
Ich werde @ Columbo's bool_pack
trick einwerfen .
Extrahiere den Ausdruck in eine constexpr
-Funktion, wenn sie komplex wird.
Sie können keine traditionelle for-Schleife mit Kompilierzeitwerten verwenden, aber es gibt viele Möglichkeiten, wie Sie eine Kompilierzeit-Sammlung durchlaufen können. In Ihrem Fall ist es jedoch nicht notwendig, jede einzelne Zahl explizit zu durchlaufen: Sie können die Erweiterung des Pakets verwenden, um sicherzustellen, dass die Zahlen nur 0
oder 1
:
Wenn Sie nach einer expliziten Möglichkeit suchen, über eine Kompilierungszeit-Auflistung von Elementen zu iterieren, empfehle ich Ihnen, in die folgenden Ressourcen zu schauen:
boost :: hana - eine moderne Metaprogrammierungsbibliothek, die Kompilierungszeitberechnungen unter Verwendung der "traditionellen" Imperativsyntax ermöglicht.
> Meine CppCon 2015 Diskussion: for_each_argument erklärt und erweitert - mit std::tuple
und der "type-value encoding" "Paradigma können Sie numerische Werte für die Kompilierung in einem Tupel speichern und während der Kompilierung darüber hinweg durchlaufen. Mein Vortrag zeigt einen möglichen Weg, so zu iterieren.
Sie können Ihre statische Validierung mit einem rekursiven Template-Helfer wie diesem implementieren. Wenn Sie dann versuchen, Code mit einer Sequenz zu kompilieren, die ungültige Zahlen enthält, erhalten Sie einen Compilerfehler mit einem statischen Assertionsfehler, wie Sie möchten.
%Vor%Tags und Links c++ c++11 variadic-templates static-assert