boost 字符类型转换boost::convert使用笔记

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 字符类型转换boost::convert使用笔记

 

当然也可以自定义一个转换模型,列个小例子:

//最好继承现有的模型如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";

 

上一篇:计应191(西)第二组 谢泽田


下一篇:WebForm基础