Я пытаюсь выучить C ++ 23 и подумал, что хорошим упражнением будет написание Sprintf ()- подобно функции, которая- при условии, что данная строка формата- это буквальный Количество аргументов соответствует количеству заполнителей (здесь только «%» для простоты) в строке формата, затем продолжает создавать и возвращать форматированную строку. Игнорируя любое форматирование строки на данный момент, я не могу получить проверку времени компиляции по количеству аргументов и заполнителей для работы. count_percents () На строковой литералле во время компиляции, я думаю, потому что мое использование std :: to_string () в sprintf () не является постоянным выражением (с помощью GCC Trunk-std = c ++ 2b). Если я удалю призыв к std :: to_string (), я могу отметить оба функции постоянно и получить желаемую проверку времени компиляции, но затем, способным делать многое другое в sprintf (), сильно ограничено (например, я не могу Используйте std :: to_string () или создать/манипулировать, затем вернуть std :: string).
Я понимаю, что могу получить желаемый результат, сделав Sprintf в Вариадический макрос, который сначала проверяет количество аргументов с прямым вызовом постоянному count_percents (), а затем вызов (неконтеваль) вспомогатель Чувствует, что должен быть лучший, без макро-способ в C ++ 23. < /p>
#include
template
constexpr size_t count_percents(const char (&s)[N]) {
size_t count = 0;
for (size_t i = 0; i < N; i++)
if (s == '%') ++count;
return count;
}
template
constexpr std::string Sprintf(const char (&format)[N], Args&&... args) {
if (count_percents(format) != sizeof...(args))
throw std::invalid_argument("wrong number of placeholders in format string");
return (std::to_string(args) + ...);
}
int main() {
std::cout
Подробнее здесь: https://stackoverflow.com/questions/794 ... format-spe
Как спринтская функция в C ++ 20/23 может подтвердить, что количество спецификаторов формата соответствует количеству пр ⇐ C++
Программы на C++. Форум разработчиков
1740430967
Anonymous
Я пытаюсь выучить C ++ 23 и подумал, что хорошим упражнением будет написание Sprintf ()- подобно функции, которая- при условии, что данная строка формата- это буквальный Количество аргументов соответствует количеству заполнителей (здесь только «%» для простоты) в строке формата, затем продолжает создавать и возвращать форматированную строку. Игнорируя любое форматирование строки на данный момент, я не могу получить проверку времени компиляции по количеству аргументов и заполнителей для работы. count_percents () На строковой литералле во время компиляции, я думаю, потому что мое использование std :: to_string () в sprintf () не является постоянным выражением (с помощью GCC Trunk-std = c ++ 2b). Если я удалю призыв к std :: to_string (), я могу отметить оба функции постоянно и получить желаемую проверку времени компиляции, но затем, способным делать многое другое в sprintf (), сильно ограничено (например, я не могу Используйте std :: to_string () или создать/манипулировать, затем вернуть std :: string).
Я понимаю, что могу получить желаемый результат, сделав Sprintf в Вариадический макрос, который сначала проверяет количество аргументов с прямым вызовом постоянному count_percents (), а затем вызов (неконтеваль) вспомогатель Чувствует, что должен быть лучший, без макро-способ в C ++ 23. < /p>
#include
template
constexpr size_t count_percents(const char (&s)[N]) {
size_t count = 0;
for (size_t i = 0; i < N; i++)
if (s[i] == '%') ++count;
return count;
}
template
constexpr std::string Sprintf(const char (&format)[N], Args&&... args) {
if (count_percents(format) != sizeof...(args))
throw std::invalid_argument("wrong number of placeholders in format string");
return (std::to_string(args) + ...);
}
int main() {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79461364/how-can-a-sprintf-like-function-in-c20-23-verify-that-the-number-of-format-spe[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия