Czy istnieje sposób wydrukowania wartości wartości constexpr
lub #define
d podczas kompilacji? Chcę równowartość std::cout <<
lub jakiś sposób na zrobienie czegoś podobnegoekwiwalent std :: cout w czasie kompilacji lub static_assert stringification wartości stałych w czasie kompilacji w 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: mogę zrobić podstawowe kompilacji drukowania constexpr
s, przynajmniej na gcc wykonując coś jak
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");
co daje mi 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, z drugiej strony, jest mniej przydatne, i po prostu mówi error: incomplete type is not allowed
) Czy istnieje sposób, aby napisać makro, które można uogólnić to tak, że można zrobić coś jak
constexpr int PI_INT = 4;
PRINT_VALUE(PI_INT)
i pojawia się komunikat o błędzie, który obejmuje 4, jakoś?
Nie zamieszczam tego jako odpowiedzi, ponieważ nie mam dowodów do przekazania, ale pamiętam, że próbowałem to zrobić w przeszłości i myślę, że standard mówi, że static_assert musi przyjmować literał ciągu, aw konsekwencji możesz zamiast tego użyj wyrażenia constexpr. Przepraszam. – je4d
Zauważ, że twoja poprawka nie używa w ogóle 'static_assert'. Po prostu odkrywa na nowo podstawową ideę konstruktu, który nic nie robi, ale kończy się niepowodzeniem. Rzecz, która wykonuje "drukowanie" również musi wykonać test, więc utknąłeś rozwiązując cały problem z SFINAE. – Potatoswatter