2016-04-04 13 views
10

C++ 11 lần đầu tiên giới thiệu hỗ trợ để xác định chữ mới thành C++ bằng phương tiện literals do người dùng xác định. Có C++ 11 hoặc sau đó cũng xác định trước hậu tố cho các số nguyên nguyên cố định chiều rộng cho các loại trong <cstdint>?Các số nguyên nguyên có chiều rộng cố định trong C++?

Trả lời

9

số Tính đến C++ 14 hậu tố đen chỉ được xác định theo tiêu chuẩn được cung cấp bởi <chrono>, <complex><string> tiêu đề trong thư viện chuẩn. Tiêu đề <chrono> xác định h, min, s, ms, us, ns hậu tố cho thời lượng thời gian, <complex> xác định i, ilif hậu tố cho con số tưởng tượng, và <string> xác định s hậu tố cho basic_string literals.

Tuy nhiên, người ta có thể dễ dàng xác định các chữ cố định chiều rộng của mình như thế này:

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

Cảnh báo: Đoạn mã trên sẽ âm thầm đưa ra kết quả sai nếu sử dụng trên literals mà không phù hợp với unsigned long long , cũng như tràn nếu giá trị chữ, không phù hợp với loại được yêu cầu, ví dụ 999_int8. A better implementation (được cấp phép GPL-3) có thể sẽ phải phân tích ký tự chữ cái theo ký tự và static_assert khi tràn, như this. Mặt khác của việc sử dụng các chữ được người dùng định nghĩa là người ta cần tiền tố hậu tố với dấu gạch dưới _, vì hậu tố không có dấu gạch dưới được dành riêng cho tiêu chuẩn hóa tương lai theo §17.6.4.3.4.

+0

Làm thế nào về [ném một ngoại lệ trên tràn, làm cho trình biên dịch thất bại] (http://stackoverflow.com/a/8626450/256138)? – rubenvb

Các vấn đề liên quan