文档章节

boost::lexical_cast

恋恋美食
 恋恋美食
发布于 2016/09/07 16:05
字数 907
阅读 694
收藏 0

lexical_cast在boost库中的声明

lexical_cast定义在boost命名空间,使用时需要包含头文件<boost/lexical_cast.hpp>.

lexical_cast由一组模版组成,不同的模版对应不同的数据类型转换。下面列出主要的两种。

    template <typename Target, typename Source>
    inline Target lexical_cast(const Source &arg)
    {
        Target result = Target();

        if (!boost::conversion::detail::try_lexical_convert(arg, result)) {
            boost::conversion::detail::throw_bad_cast<Source, Target>();
        }

        return result;
    }

    template <typename Target>
    inline Target lexical_cast(const char* chars, std::size_t count)
    {
        return ::boost::lexical_cast<Target>(
            ::boost::iterator_range<const char*>(chars, chars + count)
        );
    }

基本用法

    int x = boost::lexical_cast<int>("100");           //字符串->整型 100
    long y = boost::lexical_cast<long>("2000");        //字符串->长整型 2000
    float pai = boost::lexical_cast<float>("3.14159"); //字符串->符点型 3.14159
    double e = boost::lexical_cast<double>("2.71828"); //字符串->双精度符点型 2.71828
    double r = boost::lexical_cast<double>("1.414abcdefg", 5); //C字符串->双精度符点型(只转前5位) 1.141
    std::string str = boost::lexical_cast<std::string>(0.618); //双精度符点型->字符串 0.61799999999999999
    std::string str2 = boost::lexical_cast<std::string>(0x10); //16进制数->字符串 16

注:字符串转数字时,字符串中不能包含除数字以外的字符(表示指数的e/E除外)。例如,不能将"123L"、"0x100"这样的字符串转换成数字。

异常处理

当lexical_cast无法执行转换操作时会抛出异常boost::bad_lexical_cast。

lexical_cast在命名空间boost::conversion提供了不抛出异常的版本。

template <typename Target, typename Source>
inline bool try_lexical_convert(const Source& arg, Target& result)

template <typename Target, typename CharacterT>
inline bool try_lexical_convert(const CharacterT* chars, std::size_t count, Target& result)

该系列模板可以用来测试是否可以转换成功。

实现原理

lexical_cast 对转换对象有如下要求:

  • 转换起点对象是可流输出的,即定义了 operator<<
  • 转换终点对象是可流输入的,即定义了 operator>>
  • 转换终点对象必须是可缺省构造和可拷贝构造的

注:C++语言中的内建类型(int,double等)和std::string都满足以上的三个条件。对于自定义类,需要按照这三个条件进行分别实现。

自定义类支持lexical_cast

最主要的是定义输入输出操作符,同时可使用缺省构造函数和拷贝构造函数。

#include <iostream>
#include <boost/lexical_cast.hpp>

class DemoClass
{
public:
    
    std::string str;
};


//重载流输出操作符,可用于转换的起点
std::ostream &operator << (std::ostream &os, const DemoClass &obj)
{
    os << obj.str;
    return os;
}

//重载流输入操作符,可用于转换的终点
std::istream &operator >> (std::istream &is, DemoClass &obj)
{
    is >> obj.str;
    return is;
}

int main()
{
    DemoClass demoObj = boost::lexical_cast<DemoClass>("HelloWorld"); //demoObj.str = HelloWorld
    std::string demoStr = boost::lexical_cast<std::string>(demoObj);  //demoStr = HelloWorld
}

注:这里转换过程中如果字符串中间出现空格比如"Hello World",将导致转换失败。原因及解决办法后续提供。

C++11新标准 VS lexical_cast

C++11标准增强了字符串与数字的互操作性。新标准提供了一系列函数

字符串转数字

  • stoi
  • stol
  • stoll
  • stof
  • stod

数字转字符串

  • to_string

使用示例

    assert(std::stoi(" 42 ") == 42);         //转换int,允许有空格
    assert(std::stol("100L") == 100L);       //转换long, 支持L等后缀
    assert(std::stol("1000 9") == 1000L);    //转换long, 后面的被忽略
    assert(std::stod("3.14ispi") == 3.14);   //转换double, 遇到无效的字符停止
    assert(std::to_string(776ul) == "776");  //转换为string

与boost::lexical_cast相比。C++11标准允许字符串里出现非数字字符--会忽略起始的白空格,直到遇到无法转换的字符为止。

lexical_cast不支持空格符原因分析及解决办法

原因分析:http://blog.csdn.net/ugg/article/details/3381138

 

 

 

 

© 著作权归作者所有

恋恋美食

恋恋美食

粉丝 119
博文 178
码字总数 168099
作品 0
杭州
高级程序员
私信 提问
加载中

评论(0)

Ubuntu 安装boost库

sudo apt-get install libboost-dev libboost-dbg libboost-doc bcp libboost-* 测试 include <boost/lexical_cast.hpp> include <iostream> int main() { using boost::lexical_cast; int ......

Jian-Yong
2011/07/09
634
0
boost 1 字符串转换lexical_cast

lexical_cast 用法介绍 lexicalcast 可用于内置类型与字符串类型的转化。头文件在 boost/lexicalcast.hpp 中。它的存在很像传统的 atoi 与 itoa。 lexical_cast 进行内置类型转换字符串时,字...

sdoyuxuan
2019/01/03
0
0
C++ 中int,char,string,CString类型转换(一)

c++中string到int的转换 1) 在C标准库里面,使用atoi: #include <cstdlib> #include <string> std::string text = "152"; int number = std::atoi( text.cstr() ); if (errno == ERANGE) /......

simpower
2015/08/07
40
0
正则表达式 boost regexp的安装

正则表达式 boost regexp的安装 早就听说过这个Boost库的牛B,只是一直没有精力来学习,最近在网上查了查,评论有好有坏,但多一点是好的,不过暂时没有见过有公司使用Boost库来作为公司产品...

香芋
2012/06/08
407
0
正则表达式 boost regexp的安装

正则表达式 boost regexp的安装 早就听说过这个Boost库的牛B,只是一直没有精力来学习,最近在网上查了查,评论有好有坏,但多一点是好的,不过暂时没有见过有公司使用Boost库来作为公司产品...

香芋
2012/06/08
38
0

没有更多内容

加载失败,请刷新页面

加载更多

LiteOS云端对接教程10-LiteOS使用NB模组基于LWM2M对接华为OC平台实战

1. 在云端添加测试设备 打开之前教程新建的LWM2M产品,进入设备管理界面新建真实设备,设备标识符要填写NB模组的IMEI号,可以使用如下命令查看: AT+CGSN=1 测试结果如下: +CGSN:86772503...

小熊派开源社区
4分钟前
15
0
多团队基于git代码管理协作流程

多团队git协同开发流程 一、版本管理的挑战 虽然有这么优秀的版本管理工具,但是我们面对版本管理的时候,依然有非常大得挑战,我们都知道大家工作在同一个仓库上,那么彼此的代码协作必然带...

kingbox2016
5分钟前
26
0
Elmedia Video Player Pro for Mac(苹果万能视频播放器) v7.9中文版

mac电脑用哪款视频播放器最合适呢?elmedia video player pro Mac版是适用于Mac OS的视频播放器。它可以播放几乎任何文件类型,无论是AVI,MP4,FLV,WMV,MKV,MP3,M4V等.Elmedia Video Pl...

云不若
10分钟前
39
0
11个默克尔树开源项目

Merkle树是一种可以有效验证部分数据存在于指定数据集并且未被篡改的高效的哈希树结构,作为一种底层技术广泛应用在各种区块链的实现当中,对于商品溯源、知识产权确认、区块链公证等区块链应...

区块链教程
37分钟前
58
0
Linux系统运维工程师入门绝招放送

运维是干嘛的?安装服务器系统?重装系统再装系统?背锅的? 我就稀里糊涂的,这样报着必死的决心,考下RHCE认证,走上了Linux运维的道路,成为了一名linux运维工程师。有些心得跟大家分享下...

linuxprobe2020
41分钟前
58
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部