«Это не вопрос счастья, это требование. Рассмотрим альтернативу #8221; Даг Хортон
Как было указано ранее<boost::optional
>- фактический тип, возвращаемый основным интерфейсом<boost::convert()
>:
boost::optional<TypeOut> boost::convert(TypeIn const&, Converter const&);
Подписьфункционально завершена, обычно ускользает во время компиляции и является наиболее эффективной при развертывании базового преобразователя. Тем не менее, следующий альтернативный (и, возможно, более традиционный) интерфейс может быть потенциально более подходящим для определенных сценариев развертывания (или из-за личных предпочтений):
TypeOut convert(TypeIn const&, Converter const&, TypeOut const& fallback_value);
TypeOut convert(TypeIn const&, Converter const&, Functor const& fallback_functor);
TypeOut convert(TypeIn const&, Converter const&, boost::throw_on_failure);
Он по-прежнему обеспечивает однозначное поведение и читаемость, полную поддержку различных потоков программ и различные степени обнаружения и обработки отказов преобразования. Он может быть развернут аналогичным образом следующим образом:
struct fallback_func
{
int operator()() const { log("Failed to convert"); return 42; }
};
int i1 = convert<int>(str, cnv, fallback_value);
int i2 = convert<int>(str, cnv, fallback_func());
try
{
int i3 = convert<int>(str, cnv, boost::throw_on_failure);
}
catch (boost::bad_optional_access const&)
{
}
Тем не менее, описанные интерфейсы являются удобными обертками вокруг основного интерфейса, который обеспечивает описанное поведение:
int m1 = convert<int>(str, cnv).value_or(fallback_value);
int m2 = convert<int>(str, cnv).value_or_eval(fallback_func());
int m3 = convert<int>(str, cnv).value();
или с установленным по умолчанию преобразователем:
struct boost::cnv::by_default : public boost::cnv::cstream {};
int n1 = convert<int>(str).value_or(fallback_value);
int n2 = convert<int>(str).value_or_eval(fallback_func());
int n3 = convert<int>(str).value();