Я пытаюсь указать форматировщик для печати mdspan ранга 2 в виде матрицы, что весьма полезно. Мне бы хотелось, чтобы хотя бы форматирование элементов работало, например. std::println("{::.2e}", матрица) напечатает некоторую двойную матрицу в формате .2e для двойных значений. Трудность в том, что это нужно делать во время компиляции, я не понимаю, как это вообще делается: "{:" + std::string{spec} + "}" здесь не время компиляции, поэтому терпит неудачу. Было бы полезно увидеть, как это делается, или получить общие советы по реализации форматирования.
#include
#include
#include
template
requires (Extents::rank() == 2)
struct std::formatter {
std::string_view spec;
constexpr auto parse(format_parse_context& ctx) {
auto it = ctx.begin();
auto end = ctx.end();
spec = std::string_view{it, end};
return end;
}
auto format(const std::mdspan& md, format_context& ctx) const {
auto out = ctx.out();
*out++ = '[';
for (size_t i = 0; i < md.extent(0); ++i) {
if (i > 0) {
*out++ = '\n';
*out++ = ' ';
}
*out++ = '[';
for (size_t j = 0; j < md.extent(1); ++j) {
if (j > 0)
*out++ = ' ';
if (spec.empty())
out = std::format_to(out, "{}", md[i, j]);
else
out = std::format_to(out, "{:" + std::string{spec} + "}", md[i, j]);
}
*out++ = ']';
}
*out++ = ']';
return out;
}
};
int main() {
std::println("{::.2e}", std::mdspan((double []) {1.1111, 2, 3, 4}, 2, 2));
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... -as-matrix
C++23 форматирует mdspan как матрицу ⇐ C++
Программы на C++. Форум разработчиков
1735473473
Anonymous
Я пытаюсь указать форматировщик для печати mdspan ранга 2 в виде матрицы, что весьма полезно. Мне бы хотелось, чтобы хотя бы форматирование элементов работало, например. std::println("{::.2e}", матрица) напечатает некоторую двойную матрицу в формате .2e для двойных значений. Трудность в том, что это нужно делать во время компиляции, я не понимаю, как это вообще делается: "{:" + std::string{spec} + "}" здесь не время компиляции, поэтому терпит неудачу. Было бы полезно увидеть, как это делается, или получить общие советы по реализации форматирования.
#include
#include
#include
template
requires (Extents::rank() == 2)
struct std::formatter {
std::string_view spec;
constexpr auto parse(format_parse_context& ctx) {
auto it = ctx.begin();
auto end = ctx.end();
spec = std::string_view{it, end};
return end;
}
auto format(const std::mdspan& md, format_context& ctx) const {
auto out = ctx.out();
*out++ = '[';
for (size_t i = 0; i < md.extent(0); ++i) {
if (i > 0) {
*out++ = '\n';
*out++ = ' ';
}
*out++ = '[';
for (size_t j = 0; j < md.extent(1); ++j) {
if (j > 0)
*out++ = ' ';
if (spec.empty())
out = std::format_to(out, "{}", md[i, j]);
else
out = std::format_to(out, "{:" + std::string{spec} + "}", md[i, j]);
}
*out++ = ']';
}
*out++ = ']';
return out;
}
};
int main() {
std::println("{::.2e}", std::mdspan((double []) {1.1111, 2, 3, 4}, 2, 2));
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79314751/c23-formatting-mdspan-as-matrix[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия