powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вариативные шаблоны C++ и вариативные функции Си
5 сообщений из 55, страница 3 из 3
Вариативные шаблоны C++ и вариативные функции Си
    #39954189
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Посмотрите еще на тему форматирования

1 https://en.cppreference.com/w/cpp/utility/format
2 https://github.com/fmtlib/fmt (в т.ч. имплементация std::format)
3 https://github.com/mpark/format
...
Рейтинг: 0 / 0
Вариативные шаблоны C++ и вариативные функции Си
    #39954392
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
petrav,

Посмотрите еще на тему форматирования

1 https://en.cppreference.com/w/cpp/utility/format
2 https://github.com/fmtlib/fmt (в т.ч. имплементация std::format)
3 https://github.com/mpark/format

Спасибо, завтра начну изучать. Кстати, я тут нашёл простейший приём, который решает все проблемы:

Код: plaintext
1.
2.
3.
4.
int printf_wrapper_(const char *format, ...);

#define printf_wrapper(...) \
(false || printf(__VA_ARGS__), printf_wrapper_(__VA_ARGS__))


Просто и ясно. Студия тут же начинает выдавать предупреждения о неправильности формата и аргуменов. Правда тут же ломается перегрузка по теме printf()/wprintf().
...
Рейтинг: 0 / 0
Вариативные шаблоны C++ и вариативные функции Си
    #39954426
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav

Код: sql
1.
2.
3.
4.
int printf_wrapper_(const char *format, ...);

#define printf_wrapper(...) \
(false || printf(__VA_ARGS__), printf_wrapper_(__VA_ARGS__))


Просто и ясно. Студия тут же начинает выдавать предупреждения о неправильности формата и аргуменов. Правда тут же ломается перегрузка по теме printf()/wprintf().

Кстати, вот я уверен, что на таком коде PVS Studio сейчас в позу встанет и начнёт сыпать предупреждениями.

Что ещё нужно сделать, что бы просто начать программировать на C++, а не прорываться сквозь строй косяков?
...
Рейтинг: 0 / 0
Вариативные шаблоны C++ и вариативные функции Си
    #39954529
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
petrav,

Посмотрите еще на тему форматирования

1 https://en.cppreference.com/w/cpp/utility/format

Пока Студия 2019 не поддерживает C++ 20.

Anatoly Moskovsky
2 https://github.com/fmtlib/fmt (в т.ч. имплементация std::format)

В этой библиотеке compile time check не работает как нужно. Что-то проверяет, но вот это компилируется, хотя оно и неверно:

Код: plaintext
1.
std::string s = fmt::format(FMT_STRING("Hello, {0}!"), "world", 1.1);


Я уж не говорю о том, что "FMT_STRING" -- это макрос.


Библиотека уже три года не поддерживается, не думаю что там есть какое-то откровение.
...
Рейтинг: 0 / 0
Вариативные шаблоны C++ и вариативные функции Си
    #39954710
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
petrav
Господа, нам осталось решить одну проблему: как в одном вызове совместить и статическую проверку данных и динамическую печать данных? Желательно найти выход без макросов. Неужели выхода нет?! :-((( Вот псевдокод, он не компилируется:


Чтобы применить static_assert к выражению, все его составляющие должны быть известны на этапе компиляции.
В частности это означает что строка формата не может быть аргументом функции, а должна быть передана как аргумент шаблона.
Поэтому без макроса нельзя обойтись если вы хотите чтобы для юзера все выглядело как обычная функция.

Это я понимаю, но как же строку передать как аргумент шаблона? Гуглинг не помог, есть решения в стиле Boost.MPL, но там такие костыли и жесть нереальная. Ну и макросы. Я не думаю, что это хороший дизайн. Т.е. резко превышен болевой порог в плане костылизма.

Если явно строку не поместить как глобальную константу, то, видимо, её и нельзя передать как аргумент шаблона. По крайней мере по человечески. В принципе можно отступить от стандартного printf() style. Например так:

Код: plaintext
1.
my_print_f<fmt("%f")>(1.2);


Но я думаю это невозможно.

Если Вы забыли, напомню. Предлагается что бы заработал такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
constexpr bool check(char const *str)
{
    return str != nullptr;
}

constexpr void print_f(char const *str)
{
    static_assert(check(str)); // Compile time.
    std::printf(str);          // Run time.
}
...
Рейтинг: 0 / 0
5 сообщений из 55, страница 3 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вариативные шаблоны C++ и вариативные функции Си
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]