C++ 11では、最初に、新しいリテラルをC++に定義するために、のユーザ定義リテラルをサポートしました。 C++ 11以降では、型の固定幅の整数リテラルの接尾辞も<cstdint>
で事前定義されていますか?C++の固定幅整数リテラル?
10
A
答えて
9
号規格によって定義されたC++ 14のみリテラルサフィックスのとしては、標準ライブラリに<chrono>
、<complex>
と<string>
ヘッダによって提供されます。 <chrono>
ヘッダは、持続時間のためh
、min
、s
、ms
、us
、ns
サフィックスを定義<complex>
は虚数ためi
、il
とif
サフィックスを定義し、<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_int8
。 better implementation(GPL-3ライセンス)では、文字単位でリテラルを解析し、をオーバーフローで解析する必要があります(thisなど)。
ユーザ定義のリテラルを使用することの欠点は、アンダースコアの接尾辞が§17.6.4.3.4に従って将来の標準化のために予約されているため、接尾辞の末尾にアンダースコア_
を付加する必要があることです。
関連する問題
- 1. C++リテラル整数型
- 2. 固定幅の整数のフォーマット指定子は?
- 3. C/C++の固定幅浮動小数点数
- 4. 画面幅に固定幅レイアウトを自動調整
- 5. 固定幅の符号付き整数を符号化する固定幅の16進文字列をPythonの整数に変換する
- 6. ブートストラップボタン固定幅
- 7. 固定幅のコンテナ
- 8. 固定幅のJScrollPane
- 9. 固定幅のテキストファイル
- 10. 固定幅のブートストラップテーブルデータ
- 11. Oracle関数のdivの固定幅
- 12. 長い整数のリテラル
- 13. 固定幅の区切りに固定幅のテーブルを移動
- 14. レイアウトの固定幅、固定高さのフルハイト、全幅
- 15. css固定幅の画像と高さの自動調整
- 16. コードを固定する(複数変数、ループとオブジェクトのリテラル)
- 17. 固定幅のSKLabelNodeに合わせてテキストサイズを調整する
- 18. gmpで固定サイズの整数...?
- 19. 固定長の大きな整数
- 20. UILabel固定幅/固定幅テキスト番号を取得
- 21. Eclipseで固定幅フォントが整列していない
- 22. 固定幅コンテンツ(CSS)のフル幅背景
- 23. Cのリテラル定数とシンボリック定数の違いと定義は?
- 24. テーブル固定なしの幅
- 25. iomanip /固定幅の持続
- 26. 固定幅のCSSワードラップ/テキストオーバーフロー
- 27. 固定テーブルヘッダーIE8の幅
- 28. 固定幅Flexboxのドロップダウンメニュー?
- 29. C#ではどのような型が整数リテラルですか?
- 30. 文字列リテラルと整数のC++ constexprとマクロ
[オーバーフローで例外をスローすると、コンパイルに失敗します](http://stackoverflow.com/a/8626450/256138) – rubenvb