2016-04-04 7 views

Antwort

9

No. Ab C++ 14 die einzigen literal Suffixe durch den Standard definiert sind, durch <chrono>, <complex> und <string> Headern in der Standardbibliothek zur Verfügung gestellt. Der <chrono> Header definiert die h, min, s, ms, us, ns Suffixe für Zeitdauern, <complex> definiert die i, il und if Suffixe für imaginäre Zahlen und <string> definiert die s Suffix für basic_string Literale.

Allerdings kann man leicht ihre eigenen fester Breite Literale wie folgt definieren:

#include <cstdint> 

constexpr std::int8_t operator "" _int8(unsigned long long v) 
{ return static_cast<std::int8_t>(v); } 

constexpr std::uint8_t operator "" _uint8(unsigned long long v) 
{ return static_cast<std::uint8_t>(v); } 

constexpr std::int16_t operator "" _int16(unsigned long long v) 
{ return static_cast<std::int16_t>(v); } 

constexpr std::uint16_t operator "" _uint16(unsigned long long v) 
{ return static_cast<std::uint16_t>(v); } 

constexpr std::int32_t operator "" _int32(unsigned long long v) 
{ return static_cast<std::int32_t>(v); } 

constexpr std::uint32_t operator "" _uint32(unsigned long long v) 
{ return static_cast<std::uint32_t>(v); } 

constexpr std::int64_t operator "" _int64(unsigned long long v) 
{ return static_cast<std::int64_t>(v); } 

constexpr std::uint64_t operator "" _uint64(unsigned long long v) 
{ return static_cast<std::uint64_t>(v); } 

constexpr std::int_fast8_t operator "" _int_fast8(unsigned long long v) 
{ return static_cast<std::int_fast8_t>(v); } 

constexpr std::uint_fast8_t operator "" _uint_fast8(unsigned long long v) 
{ return static_cast<std::uint_fast8_t>(v); } 

constexpr std::int_fast16_t operator "" _int_fast16(unsigned long long v) 
{ return static_cast<std::int_fast16_t>(v); } 

constexpr std::uint_fast16_t operator "" _uint_fast16(unsigned long long v) 
{ return static_cast<std::uint_fast16_t>(v); } 

constexpr std::int_fast32_t operator "" _int_fast32(unsigned long long v) 
{ return static_cast<std::int_fast32_t>(v); } 

constexpr std::uint_fast32_t operator "" _uint_fast32(unsigned long long v) 
{ return static_cast<std::uint_fast32_t>(v); } 

constexpr std::int_fast64_t operator "" _int_fast64(unsigned long long v) 
{ return static_cast<std::int_fast64_t>(v); } 

constexpr std::uint_fast64_t operator "" _uint_fast64(unsigned long long v) 
{ return static_cast<std::uint_fast64_t>(v); } 

constexpr std::int_least8_t operator "" _int_least8(unsigned long long v) 
{ return static_cast<std::int_least8_t>(v); } 

constexpr std::uint_least8_t operator "" _uint_least8(unsigned long long v) 
{ return static_cast<std::uint_least8_t>(v); } 

constexpr std::int_least16_t operator "" _int_least16(unsigned long long v) 
{ return static_cast<std::int_least16_t>(v); } 

constexpr std::uint_least16_t operator "" _uint_least16(unsigned long long v) 
{ return static_cast<std::uint_least16_t>(v); } 

constexpr std::int_least32_t operator "" _int_least32(unsigned long long v) 
{ return static_cast<std::int_least32_t>(v); } 

constexpr std::uint_least32_t operator "" _uint_least32(unsigned long long v) 
{ return static_cast<std::uint_least32_t>(v); } 

constexpr std::int_least64_t operator "" _int_least64(unsigned long long v) 
{ return static_cast<std::int_least64_t>(v); } 

constexpr std::uint_least64_t operator "" _uint_least64(unsigned long long v) 
{ return static_cast<std::uint_least64_t>(v); } 

constexpr std::intmax_t operator "" _intmax(unsigned long long v) 
{ return static_cast<std::intmax_t>(v); } 

constexpr std::uintmax_t operator "" _uintmax(unsigned long long v) 
{ return static_cast<std::uintmax_t>(v); } 

constexpr std::intptr_t operator "" _intptr(unsigned long long v) 
{ return static_cast<std::intptr_t>(v); } 

constexpr std::uintptr_t operator "" _uintptr(unsigned long long v) 
{ return static_cast<std::uintptr_t>(v); } 

Warnung: Der obige Code wird stillschweigend das falsche Ergebnis geben, wenn auf Literale verwendet, die passen nicht in unsigned long long , sowie Überlauf, wenn der Literalwert nicht in den angeforderten Typ passt, z 999_int8. A better implementation (GPL-3 lizenziert) würde wahrscheinlich das Literal Zeichen für Zeichen und static_assert bei Überlauf, wie this analysieren.

Der Nachteil der Verwendung von benutzerdefinierten Literalen ist, dass die Suffixe mit einem Unterstrich _ versehen werden müssen, da Suffixe ohne den Unterstrich für zukünftige Standardisierung nach §17.6.4.3.4 reserviert sind.

+0

Wie wäre es mit [Ausnahmebedingung beim Überlauf, wodurch die Kompilierung fehlschlägt] (http://stackoverflow.com/a/8626450/256138)? – rubenvb

Verwandte Themen