Boost.Spirit.Karma установить точность

Я начинаю использовать функцию генерации кармы для преобразования double в char с функцией sprintf.
Для этого я использую следующий пример:

template <typename T>
class  double3_policy : public boost::spirit::karma::real_policies<T>
{
public:
template <typename T>
static unsigned int precision(T)
{

return 3;
}
};

typedef boost::spirit::karma::real_generator<double,  double3_policy<double> >  double3_type;

double3_type const double3 ;

using boost::spirit::karma::left_align;
using boost::spirit::karma::generate;

char *p = buffer;
generate(p, '[' << left_align(14)[double3] << left_align(14)[double3] << ']', 12345.000, 22/7.0);
*p = '\0';

Пример работает нормально, но метод точности статический, и я не понял, как установить это значение динамически. Я хочу указать точность для каждого использования, меняя ее во время выполнения. Я не против создать все генераторы при запуске, потому что мне нужно определенное количество точности.

Проблема в том, что я не верю, что мне нужно создавать класс для каждого точного числа, когда единственная разница между ними — возвращаемое число. Я пытался скомпилировать класс с помощью метода-члена (если это был бы метод точности членов, которого мне было бы достаточно), и я думаю, что застрял в этой проблеме метода класса.

Как я могу создавать объекты-генераторы с разной точностью и просто использовать их, не создавая более одного класса? Если бы я мог использовать только один генератор, просто изменение свойства было бы еще лучше.

Если кто-то сталкивался с такой же проблемой и может поделиться решением, будет очень полезно.

Спасибо,

2

Решение

Генераторы кармы — все о задании грамматик с использованием (во время компиляции!) Шаблонов выражений, таких как встроенный DSL.

Это действительно делает его менее чем применимым для динамических спецификаций формата.

Я бы предложил использовать

  • Printf
  • Boost Format («безопасный printf» со многими другими функциями)
  • FastFormat (http://www.fastformat.org/)

Единственный способ увидеть эту работу с Кармой — создать пользовательскую директиву для реальной печати, которая принимает точность в качестве дополнительного аргумента. Это того не стоит (и это убьет единственную выгоду, которую вы получили от использования здесь кармы: производительность).

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector