コンパイル時にconstexpr
または#define
の値を出力する方法はありますか?私はstd :: coutはコンパイル時に相当する、またはstatic_assert C++でのコンパイル時定数値の文字列化11
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");
ような何かを行うことによって、少なくともgccの上、
constexpr
秒でいくつかの基本的なコンパイル時の印刷を行うことができます:私は
std::cout <<
の同等、または編集
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)));
ような何かをするためにいくつかの方法をしたいです
これは私に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");
を与えます。私は
constexpr int PI_INT = 4;
PRINT_VALUE(PI_INT)
ような何かをし、関係のエラーメッセージを得ることができるように、これを一般化することができますマクロを書くための方法はあります(ICPCは、他の一方で、あまり有用である、とだけerror: incomplete type is not allowed
を言います) 4、何とか?
私は手元に証拠がないのでこれを投稿しませんが、過去にこれをやろうとしたことを覚えています。そして、標準ではstatic_assertが文字列リテラルを取らなければならないと言います。代わりにconstexpr式を使用しないでください。ごめんなさい。 – je4d
あなたの修正は 'static_assert'を全く使っていないことに注意してください。合格または不合格だけを行うコンストラクトの基本的なアイデアを改革しています。 「印刷」を行うこともテストを実行しなければならないので、SFINAEを使用して問題全体を解決する必要があります。 – Potatoswatter