Это назвало ленивую загрузку, потому что, как ленивый человек, Вы откладываете делать что-то, что Вы не хотите. Противоположное является Нетерпеливой Загрузкой, где Вы загружаете что-то сразу же перед необходимостью в нем.
, Если Вам любопытно, почему люди могли бы использовать ленивую загрузку, рассмотрите заявление, которое занимает время LOOOOONG для запуска. Это приложение, вероятно, делает большую нетерпеливую загрузку... загружающую вещи из диска и делающую вычисления и этажерку задолго до того, как это когда-либо необходимо.
Сравнивают это с ленивой загрузкой, приложение запустилось бы намного быстрее, но тогда в первый раз необходимо сделать что-то, что требует некоторой длительной загрузки, может быть небольшая пауза, в то время как это загружается впервые. Таким образом, с ленивой загрузкой, Вы амортизируете время загрузки на всем протяжении запуска Вашего приложения..., и можно на самом деле сохранить от загружающихся вещей, которые пользователь никогда не может намереваться использовать.
Из 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, текущий версия теперь выбирает точность совпадение.