Ограничьте точность на станд.:: суд значений по умолчанию в повышении:: options_description

Это назвало ленивую загрузку, потому что, как ленивый человек, Вы откладываете делать что-то, что Вы не хотите. Противоположное является Нетерпеливой Загрузкой, где Вы загружаете что-то сразу же перед необходимостью в нем.

, Если Вам любопытно, почему люди могли бы использовать ленивую загрузку, рассмотрите заявление, которое занимает время LOOOOONG для запуска. Это приложение, вероятно, делает большую нетерпеливую загрузку... загружающую вещи из диска и делающую вычисления и этажерку задолго до того, как это когда-либо необходимо.

Сравнивают это с ленивой загрузкой, приложение запустилось бы намного быстрее, но тогда в первый раз необходимо сделать что-то, что требует некоторой длительной загрузки, может быть небольшая пауза, в то время как это загружается впервые. Таким образом, с ленивой загрузкой, Вы амортизируете время загрузки на всем протяжении запуска Вашего приложения..., и можно на самом деле сохранить от загружающихся вещей, которые пользователь никогда не может намереваться использовать.

10
задан Christian 14 November 2009 в 17:22
поделиться

1 ответ

Из boost / program_options / value_semantic.hpp :

    /** Specifies default value, which will be used
        if none is explicitly specified. The type 'T' should
        provide operator<< for ostream.
    */
    typed_value* default_value(const T& v)
    {
        m_default_value = boost::any(v);
        m_default_value_as_text = boost::lexical_cast<std::string>(v);
        return this;
    }

    /** Specifies default value, which will be used
        if none is explicitly specified. Unlike the above overload,
        the type 'T' need not provide operator<< for ostream,
        but textual representation of default value must be provided
        by the user.
    */
    typed_value* default_value(const T& v, const std::string& textual)
    {
        m_default_value = boost::any(v);
        m_default_value_as_text = textual;
        return this;
    }

Таким образом, реализация очень проста (никогда не бывает уверенным с Boost!). Попытка перенастроить ostream так, чтобы форматирование отображалось так, как вы хотите, не сработает, потому что значение по умолчанию просто преобразуется в строку в автономном ostringstream (внутри lexical_cast ).

Простой обходной путь - добавить желаемое строковое представление в качестве второго аргумента в default_value . Затем вы можете заставить его печатать, как хотите (в том числе вообще, если вы передадите пустую строку). Примерно так:

value(&config.my_double)->default_value(0.2, "0.2")

Более "корпоративный" способ добиться того же - реализовать собственный тип, который будет заключать в оболочку double , используемый для config.my_double , и обеспечить построение и приведение к double и вашему собственному ostream & operator << с точно желаемым форматированием. Однако я не предлагаю этот подход, если вы не пишете библиотеку, которая требует универсальности.

Из примечаний Boost Lexical Cast:

Предыдущая версия lexical_cast использовала точность потока по умолчанию для чтение и запись с плавающей точкой числа. Для чисел, у которых есть соответствующая специализация std :: numeric_limits, текущий версия теперь выбирает точность совпадение.

11
ответ дан 3 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: