LINUX.ORG.RU

Дизайн format-функции.

 , ,


0

1

Пишу велосипед (хочется мне так) форматирования сообщений а-ля питоний str.format, возник вопрос по дизайну.

Интерфейс простой - pattern и аргументы-параметры. Не могу решить, как лучше передавать эти аргументы. Пока надумались такие способы:

  • format(«pattern», arg1, arg2) - как в python. Минусы - старый компилятор, variadic templates нет, придётся описывать все случаи (количество может до 30 штук варьироваться).
  • format(«pattern»).arg(arg1).arg(arg2) - как в Qt. Минусы - возможное нагромождение arg'ов и скобочек (аллергия на скобочки у меня).
  • format(«pattern») << arg1 << arg2 - как в IOStream. Минусы - загрязнять область имён операторами и вообще на операторы многие плюются.

Какой вариант лучше?

И ещё вопрос: возвращать ли string или какой-то объект, у которого есть метод .str()?

★★★
Ответ на: комментарий от schizoid
$ cat main.c 
#include <stdio.h>
int main()
{
  char buf[1024];
  sprintf(buf, "%2$s %1$s", "November", "10");
  printf("%s",buf);
  return 0;
}
$ gcc main.c -o main
$ ./main 
10 November
anonymous
()
Ответ на: комментарий от schizoid

ну так запили обертку поверх sprintf, чтобы у тебя всегда позиционные аргументы обрабатывались, а все остальное делала стандартная функция, если только в этом затык

EugeneBas ★★
()
Ответ на: комментарий от EugeneBas

Затык ещё в отсутствии проверки типов и стандартного способа вывода пользовательских типов.

schizoid ★★★
() автор топика

Я себе велосипедил аля-CL format, пользовался первым подходом, потому что такой синтаксис наиболее очевиден. Сгенерировал функции, которые получали от 0 до 50-ти аргументов, заворачивали их в список, а с ним уже работал основной код форматера.

UPD. Сразу, чтобы не было вопросов «зачем». Первостепенная причина - надоело каруселить циклы, циклы циклов и т.д. для распечатывания списков, векторов и всего такого прочего.

staseg ★★★★★
()
Последнее исправление: staseg (всего исправлений: 1)
Ответ на: комментарий от EugeneBas

Мой врапер уже пользуется другими внутренностями. Вопрос не в этом был.

schizoid ★★★
() автор топика

Первый вариант. Обнови компилятор и не мучайся.

anonymous
()
Ответ на: комментарий от schizoid

В списке хранятся указатели на class format_arg. Для всех нужных тебе типов (double и string) реализуются наследники (format_arg_double и format_arg_string). Format_arg выставляет абстрактыне функции для проверки типа template<T>bool checkType(), получения значения template<T> T const &value() и конвертации в строку std::string toString(format_settings).

staseg ★★★★★
()
Ответ на: комментарий от monk

Boost'а хотелось бы поменьше в проект, но макрос полезный, спасибо, пригодится.

schizoid ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.