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

Flexibility and Adaptability to Change

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

«Нет ничего более постоянного, чем изменение» Гераклит

Рано или поздно (во время начальной разработки или на этапе обслуживания) гибкость и адаптивность становятся важными. РазвертываниеBoost.Convertпомогает адаптироваться и изменяться в соответствии с эволюцией требований. Скажем, поток программ выиграет от небросающего поведения. Тогда:

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

// Does not throw. Returns fallback value (-1) when failed.
int i = convert<int>("uhm", boost::cnv::lexical_cast()).value_or(-1);
BOOST_TEST(i == -1); // Conversion failed. 'i' assigned the fallback value.

Компонент определяется как слишком медленный. Затем производительность может быть улучшена с минимальными усилиями за счет замены преобразователя:

#include <boost/convert/strtol.hpp>
#include <boost/convert/spirit.hpp>

boost::cnv::lexical_cast cnv1;
boost::cnv::strtol       cnv2;
boost::cnv::spirit       cnv3;
int i1 = convert<int>("123", cnv1).value();
int i2 = convert<int>("123", cnv2).value(); // Two times faster than lexical_cast.
int i3 = convert<int>("123", cnv3).value(); // Four times faster than lexical_cast.

Если вместо этого требования изменяются для поддержки большего числа входных форматов или для требования определенного выходного формата, то, опять же, это может быть выполнено с:

#include <boost/convert/stream.hpp>

boost::cnv::cstream cnv;
try
{
    int i1 = lexical_cast<int>("   123"); // Does not work.
    BOOST_TEST(!"Never reached");
}
catch (...) {}
int          i2 = convert<int>("   123", cnv(std::skipws)).value(); // Success
string       s1 = lexical_cast<string>(12.34567);
string       s2 = convert<string>(12.34567, cnv(std::fixed)(std::setprecision(3))).value();
string       s3 = convert<string>(12.34567, cnv(std::scientific)(std::setprecision(3))).value();
string expected = local::is_msc ? "1.235e+001" : "1.235e+01";
BOOST_TEST(i2 == 123);        // boost::cnv::cstream. Successfull conversion of "   123".
BOOST_TEST(s1 == "12.34567"); // boost::lexical_cast. Precision is not configurable.
BOOST_TEST(s2 == "12.346");   // boost::cnv::cstream. Precision was set to 3. Fixed.
BOOST_TEST(s3 == expected);   // boost::cnv::cstream. Precision was set to 3. Scientific.


PrevUpHomeNext

Статья Flexibility and Adaptability to Change раздела Chapter 1. Boost.Convert 2.0 Getting Started может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 09:53:15/0.0061171054840088/0