Wie werden die Werte in einem Parameter-Pack einer Variadic-Vorlage durch static_asset übernommen?

8

Ich erstelle eine variadische Vorlage.
Sagen wir, ich habe so etwas:

%Vor%

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).

    
Venemo 29.04.2016, 08:18
quelle

5 Antworten

17

Ich werde @ Columbo's bool_pack trick einwerfen .

%Vor%

Extrahiere den Ausdruck in eine constexpr -Funktion, wenn sie komplex wird.

    
T.C. 29.04.2016, 09:17
quelle
5

Einfache C ++ 14 Lösung:

%Vor%     
mpark 29.04.2016 09:01
quelle
2

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 :

sind

coliru-Beispiel

%Vor%

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.

    
Vittorio Romeo 29.04.2016 08:31
quelle
2

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%     
Smeeheey 29.04.2016 08:38
quelle
0

Noch eine andere Lösung:

%Vor%     
Mohamad Elghawi 29.04.2016 08:47
quelle