2016-04-04 9 views
10

C++ 11では、最初に、新しいリテラルをC++に定義するために、のユーザ定義リテラルをサポートしました。 C++ 11以降では、型の固定幅の整数リテラルの接尾辞も<cstdint>で事前定義されていますか?C++の固定幅整数リテラル?

答えて

9

号規格によって定義されたC++ 14のみリテラルサフィックスのとしては、標準ライブラリに<chrono><complex><string>ヘッダによって提供されます。 <chrono>ヘッダは、持続時間のためhminsmsusnsサフィックスを定義<complex>は虚数ためiilifサフィックスを定義し、<string>basic_stringリテラルのsサフィックスを定義します。

しかし、人は簡単にこのような、独自の固定幅のリテラル定義することができます。

#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); } 

警告:unsigned long longに収まらないリテラルで使用される場合は、上記のコードは黙って間違った結果が得られますがリテラル値が要求された型に収まらない場合、オーバーフローと同様に999_int8better implementation(GPL-3ライセンス)では、文字単位でリテラルを解析し、をオーバーフローで解析する必要があります(thisなど)。

ユーザ定義のリテラルを使用することの欠点は、アンダースコアの接尾辞が§17.6.4.3.4に従って将来の標準化のために予約されているため、接尾辞の末尾にアンダースコア_を付加する必要があることです。

+0

[オーバーフローで例外をスローすると、コンパイルに失敗します](http://stackoverflow.com/a/8626450/256138) – rubenvb

関連する問題