網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、引言
在boost庫(kù)中,有一個(gè)函數(shù)Boost.LexicalCast可以將數(shù)字和字符串進(jìn)行雙向轉(zhuǎn)換。本文介紹這種用法的案例。
二、Boost.LexicalCast
Boost.LexicalCast 提供了一個(gè)轉(zhuǎn)換運(yùn)算符,boost::lexical_cast,它可以將數(shù)字從字符串轉(zhuǎn)換為數(shù)字類(lèi)型,例如 int 或 double ,反之亦然。 boost::lexical_cast 是 std::stoi()、std::stod() 和 std::to_string() 等函數(shù)的替代方案,這些函數(shù)已添加到 C++11 的標(biāo)準(zhǔn)庫(kù)中。
2.1 示例1
使用boost::lexical_cast
#include <boost/lexical_cast.hpp> #include <string> #include <iostream> int main() { std::string s = boost::lexical_cast<std::string>(123); std::cout << s << '\n'; double d = boost::lexical_cast<double>(s); std::cout << d << '\n'; }
轉(zhuǎn)換運(yùn)算符 boost::lexical_cast 可以轉(zhuǎn)換不同類(lèi)型的數(shù)字。示例 6.1 首先將整數(shù) 123 轉(zhuǎn)換為字符串,然后將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)。要使用 boost::lexical_cast,請(qǐng)包含頭文件 boost/lexical_cast.hpp。
boost::lexical_cast 在內(nèi)部使用流來(lái)執(zhí)行轉(zhuǎn)換。因此,只能轉(zhuǎn)換具有重載運(yùn)算符<< 和運(yùn)算符>> 的類(lèi)型。但是,可以針對(duì)某些類(lèi)型優(yōu)化 boost::lexical_cast 以實(shí)現(xiàn)更有效的轉(zhuǎn)換。
2.2 示例2
boost::bad_lexical_cast
當(dāng)出錯(cuò)時(shí)
#include <boost/lexical_cast.hpp> #include <string> #include <iostream> int main() { try { int i = boost::lexical_cast<int>("abc"); std::cout << i << '\n'; } catch (const boost::bad_lexical_cast &e) { std::cerr << e.what() << '\n'; } }
如果轉(zhuǎn)換失敗,則會(huì)拋出從 std::bad_cast 派生的 boost::bad_lexical_cast 類(lèi)型的異常。示例 2 引發(fā)異常,因?yàn)樽址癮bc”無(wú)法轉(zhuǎn)換為 int 類(lèi)型的數(shù)字。
三、lexical_cast與c/c++提供類(lèi)似接口的比較
3.1 兩者比較
標(biāo)準(zhǔn)c家族中包含此類(lèi)函數(shù),例如atoi與itoa等,它們的缺點(diǎn)是:
(1)各個(gè)轉(zhuǎn)換都是單向的,雙向轉(zhuǎn)換為不同函數(shù),各種轉(zhuǎn)換函數(shù)不同,接口眾多;
(2)僅支持基礎(chǔ)數(shù)據(jù)類(lèi)型的子集,如int,long,double;
(3)不能提供統(tǒng)一的接口,易用性差;
c++中提供了stringstream,使用它進(jìn)行格式轉(zhuǎn)換可讀性較差,使用起點(diǎn)較高,只是簡(jiǎn)單的轉(zhuǎn)換,stringstream太重量級(jí)。
boost提供了lexical_cast,使用統(tǒng)一接口形式實(shí)現(xiàn)任意類(lèi)型之間的轉(zhuǎn)換,增強(qiáng)了易用性。但如果需要嚴(yán)密控制精度的轉(zhuǎn)換,仍然推薦使用stringstream;數(shù)值之間的轉(zhuǎn)換,推薦使用numeric_cast。
3.2 樣例
#include "iostream" #include "boost/lexical_cast.hpp" // 需要包含的頭文件 using boost::lexical_cast; using boost::bad_lexical_cast; using namespace std; int main() { char* p="32768"; int i=0; try { i=lexical_cast<int>(p); // 將字符串轉(zhuǎn)化為整數(shù) } catch(bad_lexical_cast&) // 轉(zhuǎn)換失敗會(huì)拋出一個(gè)異常 { i=0; } cout << i << endl; return i; }
原文鏈接:https://yamagota.blog.csdn.net/article/details/127132750
相關(guān)推薦
- 2022-04-14 Python+Tkinter簡(jiǎn)單實(shí)現(xiàn)注冊(cè)登錄功能_python
- 2022-08-17 Python字典查找數(shù)據(jù)的5個(gè)基礎(chǔ)操作方法_python
- 2022-06-16 Go基礎(chǔ)教程系列之defer、panic和recover詳解_Golang
- 2022-06-25 iOS自定義滑桿效果_IOS
- 2023-12-17 SpringSecurity 用戶(hù)帳號(hào)已被鎖定
- 2023-06-13 Python?base64和hashlib模塊及用法詳解_python
- 2024-02-25 Navicat提示Access violation at address **** in modul
- 2022-04-21 python工廠方法模式原理與實(shí)現(xiàn)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支