Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: Вариативные шаблоны C++ и вариативные функции Си  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6491
petrav,

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

1 https://en.cppreference.com/w/cpp/utility/format
2 https://github.com/fmtlib/fmt (в т.ч. имплементация std::format)
3 https://github.com/mpark/format
4 май 20, 21:43    [22127403]     Ответить | Цитировать Сообщить модератору
 Re: Вариативные шаблоны C++ и вариативные функции Си  [new]
petrav
Member

Откуда:
Сообщений: 2074
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

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

int printf_wrapper_(const char *format, ...);

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

Просто и ясно. Студия тут же начинает выдавать предупреждения о неправильности формата и аргуменов. Правда тут же ломается перегрузка по теме printf()/wprintf().
5 май 20, 19:14    [22127785]     Ответить | Цитировать Сообщить модератору
 Re: Вариативные шаблоны C++ и вариативные функции Си  [new]
petrav
Member

Откуда:
Сообщений: 2074
petrav

int printf_wrapper_(const char *format, ...);

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

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

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

Что ещё нужно сделать, что бы просто начать программировать на C++, а не прорываться сквозь строй косяков?
5 май 20, 21:10    [22127834]     Ответить | Цитировать Сообщить модератору
 Re: Вариативные шаблоны C++ и вариативные функции Си  [new]
petrav
Member

Откуда:
Сообщений: 2074
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 не работает как нужно. Что-то проверяет, но вот это компилируется, хотя оно и неверно:

std::string s = fmt::format(FMT_STRING("Hello, {0}!"), "world", 1.1);

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

Anatoly Moskovsky
3 https://github.com/mpark/format

Библиотека уже три года не поддерживается, не думаю что там есть какое-то откровение.
6 май 20, 11:25    [22128031]     Ответить | Цитировать Сообщить модератору
 Re: Вариативные шаблоны C++ и вариативные функции Си  [new]
petrav
Member

Откуда:
Сообщений: 2074
Anatoly Moskovsky
petrav
Господа, нам осталось решить одну проблему: как в одном вызове совместить и статическую проверку данных и динамическую печать данных? Желательно найти выход без макросов. Неужели выхода нет?! :-((( Вот псевдокод, он не компилируется:


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

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

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

my_print_f<fmt("%f")>(1.2);

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

Если Вы забыли, напомню. Предлагается что бы заработал такой код:
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.
}
6 май 20, 17:18    [22128341]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / C++ Ответить