K>Всегда использовал такую лабуду, чтобы напечатать константу в аутпуте компилятора:
K>Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?
Мышку на ParameterToPrint наведи в VSCode+clangd))0)0
Re[4]: Распечатать compile-time константу в выводе компилятора
Здравствуйте, koenjihyakkei, Вы писали:
K>кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?
В C/C++ многие простые и очевидные вещи приходится делать через задницу, ибо разработчики языка до таких мелочей не снисходят, они заняты высоким и утонченным.
Re: Распечатать compile-time константу в выводе компилятора
K>error: implicit instantiation of undefined template 'Foo<64>'
K>
K>Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?
Можно использовать несоответствие типов формальных и фактических параметров, чтоб спровоцировать ошибку вида: "cannon convert 'A' to 'B'". Осталось только подобрать какую-нибудь функцию, желательно из стандартной библиотеки, чтоб не объявлять свои. Нарпимер printf:
const int ParameterToPrint = 42;
std::printf(std::integral_constant<int, ParameterToPrint>{});
MSVC: "cannot convert argument 1 from 'std::integral_constant<int,42>' to 'const char*"
GCC: "invalid user-defined conversion from 'std::integral_constant<int, 42>' to 'const char*'"
Здравствуйте, rg45, Вы писали:
R>Можно использовать несоответствие типов формальных и фактических параметров, чтоб спровоцировать ощибку
В том и задница, что все известные способы завязаны на создание ошибки — и, как следствие, невозможность завершить компиляцию. Если бы разработчики языка меньше думали о высоком и красивом, такие средства давно были бы включены в язык штатно, безо всяких провоцируемых ошибок.
Re[3]: Распечатать compile-time константу в выводе компилятора
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В том и задница, что все известные способы завязаны на создание ошибки — и, как следствие, невозможность завершить компиляцию. Если бы разработчики языка меньше думали о высоком и красивом, такие средства давно были бы включены в язык штатно, безо всяких провоцируемых ошибок.
Как я понимаю, ты хочешь пригласить меня в очередную дискуссию о несовершенстве современного С/С++? Спасибо за приглашение, но я пропущу в этот раз.
--
Re: Распечатать compile-time константу в выводе компилятора
Здравствуйте, koenjihyakkei, Вы писали:
K>Всегда использовал такую лабуду, чтобы напечатать константу в аутпуте компилятора:
K>Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?
на MSVC компиляторах есть
#pragma message (__FUNCSIG__) обычно заводится
и используется для компайл тайм дебага.
нечто подобное но с ворнингами (чаще "-Wuninitialized") делаеnся и в gcc, где выкладка от компайлера обычно глубже по стеку.
Re[2]: Распечатать compile-time константу в выводе компилятора
Это очень кривой прием. Если уж использовать шаблон, в него нужно вставлять не #pragma, которая должна обрабатываться на стадии препроцессирования, а __pragma, которая обрабатывается на стадии компиляции. #pragma в шаблоне должна срабатывать еще до того, как шаблон будет обработан компилятором, выводя текст "__FUNCSIG__", поскольку ни о каких сигнатурах препроцессор знать не должен.
Но еще лучше использовать нормальный макрос с __pragma (message ()), который будет выводить любой заданный текст, а не служебную информацию, к которой сбоку присобачена какая-то дополнительная.
Re[3]: Распечатать compile-time константу в выводе компилято
ЕМ>Если уж использовать шаблон, в него нужно вставлять не #pragma, которая должна обрабатываться на стадии препроцессирования, а __pragma, которая обрабатывается на стадии компиляции.
О, снова новости из параллельной реальности. __pragma от #pragma отличается только тем, что ее можно использовать внутри макроопределений и то, что это microsoft specific keyword. И все, больше ни чем. Ни о каких обработках на стадии компиляции речи нигде не идет.
Pragma directives specify machine-specific or operating system-specific compiler features. A line that starts with #pragma specifies a pragma directive. The Microsoft-specific __pragma keyword enables you to code pragma directives within macro definitions. The standard _Pragma preprocessor operator, introduced in C99 and adopted by C++11, is similar.