Я начинаю использовать функцию генерации кармы для преобразования 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';
Пример работает нормально, но метод точности статический, и я не понял, как установить это значение динамически. Я хочу указать точность для каждого использования, меняя ее во время выполнения. Я не против создать все генераторы при запуске, потому что мне нужно определенное количество точности.
Проблема в том, что я не верю, что мне нужно создавать класс для каждого точного числа, когда единственная разница между ними — возвращаемое число. Я пытался скомпилировать класс с помощью метода-члена (если это был бы метод точности членов, которого мне было бы достаточно), и я думаю, что застрял в этой проблеме метода класса.
Как я могу создавать объекты-генераторы с разной точностью и просто использовать их, не создавая более одного класса? Если бы я мог использовать только один генератор, просто изменение свойства было бы еще лучше.
Если кто-то сталкивался с такой же проблемой и может поделиться решением, будет очень полезно.
Спасибо,
Генераторы кармы — все о задании грамматик с использованием (во время компиляции!) Шаблонов выражений, таких как встроенный DSL.
Это действительно делает его менее чем применимым для динамических спецификаций формата.
Я бы предложил использовать
Единственный способ увидеть эту работу с Кармой — создать пользовательскую директиву для реальной печати, которая принимает точность в качестве дополнительного аргумента. Это того не стоит (и это убьет единственную выгоду, которую вы получили от использования здесь кармы: производительность).
Других решений пока нет …