Gibt es eine Möglichkeit für die Kompilierzeitprüfung von Zeichenfolgen-benutzerdefiniertem Literal?

8

Ich schreibe ein benutzerdefiniertes string literal, um Namen von Monaten in ihre Zahlen umzuwandeln. Die erwartete Verwendung dieses Literals ist etwas wie

%Vor%

sollte 11 zurückgeben.

Im Moment sieht mein Code wie

aus %Vor%

Dabei ist constexpr int convert_month_to_int(const char, size_t) eine Funktion, die die tatsächliche Konvertierung durchführt (oder -1 zurückgibt, wenn der Monatsname falsch ist).

Das Problem ist, dass ich eine Art Kompilierungsfehler anzeigen möchte, wenn die an dieses Literal übergebene Zeichenfolge keinen Monat angibt. Ich habe versucht, static_assert folgendermaßen zu verwenden:

%Vor%

aber das funktioniert nicht, da der Compiler nicht sicher ist, dass convert_month_to_int(str, len) ein konstanter Ausdruck sein wird.

Gibt es eine Möglichkeit, dieses Verhalten zu erreichen?

    
alexeykuzmin0 06.08.2016, 09:03
quelle

2 Antworten

2

Ich habe dieses Problem auf eine andere Art und Weise angesprochen, indem ich weder Enums noch String-Literale verwende und schlechte Monatsnamen auch dann erkannt werden, wenn sie nicht als constexpr :

konstruiert sind %Vor%

Der von mir verwendete Ansatz besteht in der Definition eines Klassentyps month Das ist dokumentiert als literaler Klassentyp .

Ich habe dann constexpr Instanzen jedes Monats erstellt :

%Vor%

( CONSTDATA ist ein Makro, um Compilern zu helfen, die nicht ganz mit C ++ 11 constexpr support vorhanden sind).

Ich habe auch die gleiche Technik für Tage der Woche verwendet.

Das Obenstehende wurde mit clang mit -std=c++11 kompiliert. Es funktioniert auch mit gcc. Die constexpr -Bits sind in VS gebrochen, aber alles andere funktioniert, einschließlich der Erkennung schlechter Monatsnamen zur Kompilierzeit.

    
Howard Hinnant 06.08.2016, 15:45
quelle
3

Ich stimme dem Vorschlag zu, stattdessen ein enum zu verwenden.

Aber wie auch immer, der übliche Weg, um einen Fehler wie diesen in einer constexpr -Funktion zu signalisieren, ist eine Ausnahme auszulösen.

%Vor%

Siehe auch ​​diese Frage zum Beispiel.

    
Chris Beck 06.08.2016 11:12
quelle