Boost::Lexical_cast 的使用
、C++代码 #include <boost/lexical_cast.hpp> #include <iostream> int main() { using boost::lexical_cast; "); double b = lexical_cast<double>("123.12"); std::cout<<a<<std::endl std::cout<<b<<std::endl; ; } 、数值->字符串 C++代码 #include <boost/lexical_cast.hpp> #include <string> #include <iostream> int main() { using std::string; const double d = 123.12; string s = boost::lexical_cast<string>(d); std::cout<<s<<std::endl; ; } 、异常 C++代码 #include <boost/lexical_cast.hpp> #include <iostream> int main() { using std::cout; using std::endl; int i; try { i = boost::lexical_cast<int>("xyz"); } catch(boost::bad_lexical_cast& e) { cout<<e.what()<<endl; ; } cout<<i<<endl; ; } 显然“xyz”并不能转换为一个int类型的数值,于是抛出异常,捕捉后输出“bad lexical cast: source type value could not be interpreted as target”这样的信息。 、注意事项 lexical_cast依赖于字符流std::stringstream,其原理相当简单:把源类型读入到字符流中,再写到目标类型中,就大功告成。 C++代码 "); 相当于 C++代码 int d; std::stringstream s; s<<"; s>>d; 、boost::lexical_cast 的原型: template<typename Target, typename Source> Target lexical_cast(Source arg); lexical_cast 是依赖于字符串流 std::stringstream 的,其原理也是相当的简单:把源类型 (Source) 读入到字符流中,再写到目标类型 (Target) 中。但这里同时也带来了一些限制: - 输入数据 (arg) 必须能够 “完整” 地转换,否则就会抛出 bad_lexical_cast 异常。例如: int i = boost::lexical_cast<int>("123.456"); // this will throw 因为 “,不能 “完整” 地转换为 123.456,还是让我们需要适当的注意一些这两个模板参数就好了。 - 由于 Visual C++ 的本地化(locale)部分实现有问题,如果使用了非默认的 locale,可能会莫名其妙地抛出异常。 - 源类型 (Source) 必须是一个可以输出到输出流的类型(OutputStreamable),也意味着该类型需要 operator<< 被定义。 - 同样的,目标类型 (Target) 必须是一个可以输入到输入流的类型 (InputStreamable),也意味着该类型需要 operator>> 被定义。 - 另外,Both Source and Target are CopyConstructible。 - Target is DefaultConstructible。 其中,下面的四个限制是在使用自定义类型之间转换时必须做的一些工作的(当然流行的使用的 C 库函数等等都是不可以处理自定义类型之间的转换的)。 #include <boost/lexical_cast.hpp> #include <iostream> #include <string> #define ERROR_LEXICAL_CAST 1 int main() { using boost::lexical_cast; ; double b = 0.0; std::string s = ""; ; try { // ----- 字符串 --> 数值 a = lexical_cast<"); b = lexical_cast<double>("123.12"); // ----- 数值 --> 字符串 s = lexical_cast<std::string>("123456.7"); // ----- 异常处理演示 e = lexical_cast<int>("abc"); } catch(boost::bad_lexical_cast& e) { // bad lexical cast: source type value could not be interpreted as target std::cout << e.what() << std::endl; return ERROR_LEXICAL_CAST; } std::cout << a << std::endl; // 输出:123 std::cout << b << std::endl; // 输出:123.12 std::cout << s << std::endl; // 输出:123456.7 ; } 、小结 我们已经体验了boost::lexcial_cast。当然,lexical_cast不仅仅局限于字符串类型与数值类型之间的转换:可在任意可输出到stringstream的类型和任意可从stringstream输入的类型间转换。 一、lexical_cast的作用 lexical_cast使用统一的接口实现字符串与目标类型之间的转换。 二、lexical_cast与c/c++提供类似接口的比较 标准c家族中包含此类函数,例如atoi与itoa等,它们的缺点是: ()各个转换都是单向的,双向转换为不同函数,各种转换函数不同,接口众多; ()仅支持基础数据类型的子集,如int,long,double; ()不能提供统一的接口,易用性差; c++中提供了stringstream,使用它进行格式转换可读性较差,使用起点较高,只是简单的转换,stringstream太重量级。 boost提供了lexical_cast,使用统一接口形式实现任意类型之间的转换,增强了易用性。但如果需要严密控制精度的转换,仍然推荐使用stringstream;数值之间的转换,推荐使用numeric_cast。 三、lexical_cast的样例 #include "iostream" #include "boost/lexical_cast.hpp" // 需要包含的头文件 using boost::lexical_cast; using boost::bad_lexical_cast; using namespace std; int main() { "; ; try { i=lexical_cast<int>(p); // 将字符串转化为整数 } catch(bad_lexical_cast&) // 转换失败会抛出一个异常 { i=; } cout << i << endl; return i; }
Boost::Lexical_cast 的使用的更多相关文章
- boost/lexical_cast.hpp的简单使用方法_行动_新浪博客
boost/lexical_cast.hpp的简单使用方法_行动_新浪博客 boost/lexical_cast.hpp的简单使用方法 (2010-03-19 16:31:13) ...
- boost.lexical_cast 学习
1,字符串 到 数值类型的转换 2,数值 到 字符串的转换 3,异常处理情况 4,boost::lexical_cast 的原型: template<typename Target, typen ...
- boost::lexical_cast
boost::lexical_cast为数值之间的转换(conversion)提供了一揽子方案,比如:将一个字符串"转换成整数123,代码如下: "; int a = lexica ...
- Boost::lexical_cast类型转换
1.字符串->数值 C++代码 #include <boost/lexical_cast.hpp> #include <iostream> int main() { us ...
- 用boost::lexical_cast进行数值转换
在STL库中,我们可以通过stringstream来实现字符串和数字间的转换: int i = 0; stringstream ss; ss << "123"; ...
- [转] boost:lexical_cast用法
转载地址:http://www.habadog.com/2011/05/07/boost-lexical_cast-intro/ 一.lexical_cast的作用lexical_cast使用统一的接 ...
- boost之lexical_cast
第一次翻译,虽然是个很简单的函数介绍... 文件boost/lexical_cast.hpp中定义了此函数: namespace boost { class bad_lexical_cast; tem ...
- boost 学习笔记 1: lexical_cast
参考原著地址:http://einverne.github.io/post/2015/12/boost-learning-note-1.html 转换对象要求 lexical_cast 对转换对象有如 ...
- ros下boost移植
参考资料: http://blog.chinaunix.net/uid-12226757-id-3427282.html 注意:本链接中只看第一种的方法,验证程序参考以下: Boost安装成功的验证 ...
随机推荐
- inux权限管理(1)
1.linux系统文件普通权限 2.文件所属主的设置,组的指定 3.特殊权限 4.acl权限 5.su命令及其注意事项和sudo权限 6.权限管理的注意点 0.首先,在linux下用户账户是分角色的, ...
- session和cookie基本操作
session的作用同cookie一样: 1.在不同页面使用同一数组 2.实现验证码,用户跟踪(个人觉得这个用到的其实还是1中的作用) session相对于cookie更加的安全 先来说一下cooki ...
- <一>dubbo框架学前原理介绍
alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产 ...
- hdu 1426(DFS+坑爹的输入输出)
Sudoku Killer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 兼容python3的SSDB客户端
SSDB.py import socket class SSDB_Response(object): def __init__(self, code='', data_or_message=None) ...
- Thinking in java基础之集合框架(转载)
集合简介(容器)把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成一个东西(一个对象),然后我们借用袋子把这20个苹果装起来,而这个袋子就是集合(也叫 ...
- electron调用C#应用程序实现串口通信
最近转入零售行业开发了一系列产品,包含便利店收银软件.会员系统.供应链系统.为了追赶潮流,收银软件使用了electron平台开发,界面效果.开发效率确实不错:但是涉及到串口通讯时遇到了麻烦,elect ...
- (2)ansible主机清单文件inventory
1)inventory作用 作用:通常用于定义要管理主机的认证信息,例如ssh登录用户名,密码等相关信息 缺省文件:/etc/ansible/hosts 2)定义主机组方式 #vim /etc/ans ...
- thinkjphp 模板中获取url中的action
<if condition="ACTION_NAME eq 'add'">新增<else/>编辑</if>
- 转:java-Servlet开发
转:http://www.cnblogs.com/xdp-gacl/p/3760336.html 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司 ...