using std::string;
using boost::lexical_cast;
using boost::convert;
boost::cnv::cstream cnv;
int i1 = lexical_cast<int>("123");
int i2 = convert<int>("123", cnv).value();
int i3 = convert<int>("uhm", cnv).value_or(-1);
BOOST_TEST(i1 == 123);
BOOST_TEST(i2 == 123);
BOOST_TEST(i3 == -1);
Вышеуказанные призывы выражаются на английском языке как
- "Преобразовать строку в intДля<
i1
>и<i2
> - "преобразовать строку в int и вернуть -1, если преобразование не удается"для<
i3
>.
<i1
>и<i2
>развертывания выглядят достаточно близко и ведут себя одинаково. А именно, если запрошенная конверсия не удалась, выбрасывается исключение. Инструкции пользователя не описывают, что делать, если конверсия не работает. Следовательно,<boost::lexical_cast
>и<boost::convert
>рассматривают отказ от преобразования как «исключительный» и бросают.
Спецификация<i3
>, с другой стороны, ясна о сбоях преобразования, поэтому поставляемое значение запаса возвращается, если запрошенное преобразование не удается.
Этого базового обнаружения и обработки ошибок может быть достаточно для различных конверсий. Например:
int i1 = convert<int>(s1, cnv(std::hex)).value_or(-1);
int i2 = convert<int>(s2, cnv(std::dec)).value_or(-1);
if (i1 == -1) log("bad i1"), i1 = default_i1;
if (i2 == -1) log("bad i2"), i2 = default_i2;
Или
int
fallback_fun(char const* msg, int fallback_value)
{
log(msg); return fallback_value;
}
int i1 = convert<int>(s1).value_or_eval(boost::bind(fallback_fun, "bad i1", default_i1));
int i2 = convert<int>(s2).value_or_eval(boost::bind(fallback_fun, "bad i2", default_i2));
Или, если мы не заботимся о сбоях конверсии:
int i1 = convert<int>(s1, cnv(std::hex)).value_or(default_i1);
int i2 = convert<int>(s2, cnv(std::dec)).value_or(default_i2);
До сих пор развертывание<boost::convert
>кажется более гибким, компактным и естественным (ваш пробег может варьироваться) и потенциально более эффективным по сравнению с<boost::lexical_cast
>.
int i1 = default_i1;
try
{
i1 = lexical_cast<int>(str);
}
catch (...)
{
log("bad i1");
}
По замыслу, это только поведение<boost::lexical_cast
>— прямое и понятное, но ограниченное. Это делает довольно много законных потоков процесса/программы трудными и неудобными для реализации.Boost.Convertобращается к этому с дополнительной функциональностью, гибкостью и удобством.