«Нет ничего более постоянного, чем изменение» Гераклит
Рано или поздно (во время начальной разработки или на этапе обслуживания) гибкость и адаптивность становятся важными. РазвертываниеBoost.Convertпомогает адаптироваться и изменяться в соответствии с эволюцией требований. Скажем, поток программ выиграет от небросающего поведения. Тогда:
using std::string;
using boost::lexical_cast;
using boost::convert;
int i = convert<int>("uhm", boost::cnv::lexical_cast()).value_or(-1);
BOOST_TEST(i == -1);
Компонент определяется как слишком медленный. Затем производительность может быть улучшена с минимальными усилиями за счет замены преобразователя:
#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();
int i3 = convert<int>("123", cnv3).value();
Если вместо этого требования изменяются для поддержки большего числа входных форматов или для требования определенного выходного формата, то, опять же, это может быть выполнено с:
#include <boost/convert/stream.hpp>
boost::cnv::cstream cnv;
try
{
int i1 = lexical_cast<int>(" 123");
BOOST_TEST(!"Never reached");
}
catch (...) {}
int i2 = convert<int>(" 123", cnv(std::skipws)).value();
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_TEST(s1 == "12.34567");
BOOST_TEST(s2 == "12.346");
BOOST_TEST(s3 == expected);