boost 字符类型转换一般都是用lexical_cast,还有一种转换方式是使用convert。其实convert只是封装了一个框架,不负责具体类型转换业务,而lexical_cast就可以为convert使用。
convert使用范例:
#include <iostream>
#include <string>
#include <boost/convert.hpp>
#include <boost/convert/lexical_cast.hpp>
void main()
{
boost::cnv::lexical_cast cnv;
boost::optional<int> v = boost::convert<int>("1234", cnv);//转换失败会抛出异常,这里没处理
int v1 = boost::convert<int>("1234", cnv).value_or(-1);
}
另外convert默认实现支持以下几种转换模型:
#include <boost/convert/lexical_cast.hpp>
boost::cnv::lexical_cast cnv1;
#include <boost/convert/strtol.hpp>
boost::cnv::strtol cnv2;
#include <boost/convert/spirit.hpp>
boost::cnv::spirit cnv3;
#include <boost/convert/stream.hpp>
boost::cnv::cstream ccnv4;
boost::cnv::wstream wcnv4;
#include <boost/convert/printf.hpp>
boost::cnv::printf cnv5;
他们大部分时候可以相互替换使用,其转换效率如下(gcc 5.4.0 + Ubuntu 16.04 x64):
当然也可以自定义一个转换模型,列个小例子:
//最好继承现有的模型如boost::cnv::lexical_cast,只处理自己关心的类型转换
struct MyConvertor
{
template<typename TypeOut, typename TypeIn>
void operator()(TypeIn const& value_in, boost::optional<TypeOut>& result_out) const
{
//todo
}
//偏特化
void operator()(int const& value_in, boost::optional<std::string>& result_out) const
{
result_out = itoa(value_in);
}
//....
};
还有一些关于浮点数转换精度,16进制字符串转换等简单示例如下:
int i1 = convert<int>("e32c", ccnv(std::hex)).value_or(-1); //失败返回-1
int i2 = convert<int>(" 1234", cnv1(boost::cnv::parameter::base=boost::cnv::base::dec)).value_or(-1); //类型赋值
std::string i3 = convert<std::string>(1234, ccnv(std::hex)).value_or("bad");
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";