Gibt es eine Möglichkeit, den Wert eines constexpr
oder #define
d Wert zur Kompilierzeit zu drucken? Ich möchte das Äquivalent von std::cout <<
oder irgendeine Art und Weise wie Bearbeiten etwasstd :: cout entspricht zur Kompilierzeit, oder static_assert stringification der Kompilierzeitkonstante Werte in 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)));
zu tun: Ich kann einige grundlegende Compile-Zeit zu tun mit constexpr
s Druck, zumindest auf gcc durch so etwas wie
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");
was gibt mir 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, auf der anderen Seite, ist wenig hilfreich, und sagt nur error: incomplete type is not allowed
) Gibt es eine Möglichkeit, einen Makro zu schreiben, die diese verallgemeinern können, so dass ich so etwas wie
constexpr int PI_INT = 4;
PRINT_VALUE(PI_INT)
tun kann, und eine Fehlermeldung erhalten, die beinhaltet 4, irgendwie?
Nicht als eine Antwort zu veröffentlichen, weil ich keine Beweise zur Hand haben, aber ich erinnere mich, dies in der Vergangenheit zu tun, und ich denke, der Standard sagt, dass static_assert ein String Literal nehmen muss, und als Konsequenz können Sie verwende stattdessen keinen constexpr-Ausdruck. Es tut uns leid. – je4d
Beachten Sie, dass Ihr Fix nicht wirklich 'static_assert' verwendet. Es erfindet nur die Grundidee eines Konstrukts neu, das nichts weiter tut, als zu bestehen oder zu versagen. Die Sache, die das "Drucken" macht, muss auch den Test durchführen, so dass Sie das Problem mit SFINAE lösen müssen. – Potatoswatter