Có cách nào để in giá trị của một giá trị constexpr
hoặc #define
d tại thời gian biên dịch không? Tôi muốn tương đương với std::cout <<
, hoặc một số cách để làm điều gì đó nhưstd :: cout tương đương tại thời gian biên dịch, hoặc static_assert xâu chuỗi các giá trị hằng số biên dịch trong C++ 11
constexpr int PI_INT = 4;
static_assert(PI_INT == 3,
const_str_join("PI_INT must be 3, not ", const_int_to_str(PI_INT)));
Edit: tôi có thể làm một số cơ bản thời gian biên dịch in với constexpr
s, ít nhất là trên gcc bằng cách làm một cái gì đó giống như
template <int v>
struct display_non_zero_int_value;
template <>
struct display_non_zero_int_value<0> { static constexpr bool foo = true; };
static constexpr int v = 1;
static_assert(v == 0 && display_non_zero_int_value<v>::foo, "v == 0");
cung cấp cho tôi error: incomplete type ‘display_non_zero_int_value<1>’ used in nested name specifier static_assert(v == 0 && display_non_zero_int_value<v>::foo, "v == 0");
. (ICPC, mặt khác, là ít hữu ích, và chỉ nói error: incomplete type is not allowed
) Có cách nào để viết một macro có thể khái quát này để tôi có thể làm điều gì đó như
constexpr int PI_INT = 4;
PRINT_VALUE(PI_INT)
và nhận được một thông báo lỗi có liên quan đến 4, bằng cách nào đó?
Không đăng câu trả lời này vì tôi không có bằng chứng, nhưng tôi nhớ đã cố gắng làm điều này trong quá khứ và tôi nghĩ tiêu chuẩn nói rằng static_assert phải lấy chuỗi ký tự, và kết quả là bạn có thể 't sử dụng một biểu thức constexpr thay thế. lấy làm tiếc. – je4d
Lưu ý rằng bản sửa lỗi của bạn không thực sự sử dụng 'static_assert'. Nó chỉ là tái tạo lại ý tưởng cơ bản của một cấu trúc không làm gì ngoài việc vượt qua hoặc thất bại. Điều mà "in ấn" cũng phải thực hiện kiểm tra, vì vậy bạn đang gặp khó khăn trong việc giải quyết toàn bộ vấn đề với SFINAE. – Potatoswatter