Ich schreibe ein benutzerdefiniertes string
literal, um Namen von Monaten in ihre Zahlen umzuwandeln. Die erwartete Verwendung dieses Literals ist etwas wie
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:
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?
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
:
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 :
( 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.
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.
Siehe auch diese Frage zum Beispiel.
Tags und Links c++ c++11 user-defined-literals