Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Basic Conversion-Failure Detection

Boost , Chapter 1. Boost.Convert 2.0 , Getting Started

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

using std::string;
using boost::lexical_cast;
using boost::convert;

boost::cnv::cstream cnv;
int i1 = lexical_cast<int>("123");              // Throws when conversion fails.
int i2 = convert<int>("123", cnv).value();      // Throws when conversion fails.
int i3 = convert<int>("uhm", cnv).value_or(-1); // Returns -1 when conversion fails.
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); // Read as hex
int i2 = convert<int>(s2, cnv(std::dec)).value_or(-1); // Read as decimal
if (i1 == -1) log("bad i1"), i1 = default_i1; // Log failure. Proceed with the default
if (i2 == -1) log("bad i2"), i2 = default_i2; // Log failure. Proceed with the default
// ... proceed

Или

int
fallback_fun(char const* msg, int fallback_value)
{
    // The principal advantage of a fallback_func over a fallback_value
    // is that the former is only called when the conversion request fails.
    // Consequently, the returned fallback_value is only calculated (which potentially
    // might be expensive) when it is absolutely necessary.
    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));
// ... proceed

Или, если мы не заботимся о сбоях конверсии:

int i1 = convert<int>(s1, cnv(std::hex)).value_or(default_i1); // If failed, proceed with the default
int i2 = convert<int>(s2, cnv(std::dec)).value_or(default_i2); // If failed, proceed with the default
// ... proceed

До сих пор развертывание<boost::convert>кажется более гибким, компактным и естественным (ваш пробег может варьироваться) и потенциально более эффективным по сравнению с<boost::lexical_cast>.

int i1 = default_i1;
try
{
    i1 = lexical_cast<int>(str);
}
catch (...)
{
    log("bad i1");
}

По замыслу, это только поведение<boost::lexical_cast>— прямое и понятное, но ограниченное. Это делает довольно много законных потоков процесса/программы трудными и неудобными для реализации.Boost.Convertобращается к этому с дополнительной функциональностью, гибкостью и удобством.


PrevUpHomeNext

Статья Basic Conversion-Failure Detection раздела Chapter 1. Boost.Convert 2.0 Getting Started может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Getting Started ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 19:54:42/0.0086100101470947/1