Как вывести постоянное значение во время компиляции? - PullRequest
0 голосов
/ 21 декабря 2018

При метапрограммировании шаблона трюк TD можно использовать для печати выражений type в качестве сообщения об ошибке во время компиляции.

Это действительно полезно для отладки шаблонов.Есть ли аналогичный способ печати значений , которые вычисляются во время компиляции?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вы также можете использовать static_assert для этой работы:

template<int val>
void static_print()
{
    static_assert(val & false, "");
}

int main()
{
    static_print<12*34>();
}

, которые выводятся на g ++:

x.cc: In instantiation of ‘void static_print() [with int val = 408]’:
x.cc:9:22:   required from here
x.cc:4:20: error: static assertion failed
  static_assert(val & false, "");

или в clang:

x.cc:9:2: note: in instantiation of function template specialization 'static_print<408>' requested here
    static_print<12*34>();
    ^
0 голосов
/ 21 декабря 2018

Да, и код выглядит очень похоже: вы объявляете (но не определяете) template struct, значение которого является параметром шаблона.Пытаясь создать его экземпляр, не определяя его, вы получаете ошибку компилятора, в которой записано постоянное значение:

template <int val>
struct PrintConst;

PrintConst<12*34> p;

При компиляции этого кода g++ завершается ошибкой со следующей ошибкой:

const-display.cpp:4:19: error: aggregate ‘PrintConst<408> p’ has incomplete type and cannot be defined
 PrintConst<12*34> p;
                   ^

Обратите внимание, что оно показывает как выражение 12*34, так и полученное значение 408.

...