看了凌杰的文章(http://blog.csdn.net/owl2008/archive/2004/09/28/119595.aspx),也想补充两句。lexical_cast比起stringstream来说,的确不一定简洁,当然,其语义和可读性都有提高,但同时也失之灵活。例如下面的情况,似乎就无法用lexical_cast办到。
#include <sstream>
using namespace std;
int main(int, char*[]) {
string hex_str = "0x10";
int i;
std::stringstream convert(hex_str);
convert >> hex >> i;
return 0;
}
如果想像笔者这样在16进制的整数和字符串之间转换,似乎还不得不用stringstream,我阅读了lexical_cast的代码,其实它就是用stringstream实现的,lexical_cast函数本身的代码非常短,如下:
template<typename Target, typename Source>
Target lexical_cast(Source arg)
{
detail::lexical_stream<Target, Source> interpreter;
Target result;
if(!(interpreter << arg && interpreter >> result))
throw_exception(bad_lexical_cast(typeid(Target), typeid(Source)));
return result;
}
主要的实现部分在lexical_stream的两个重载方法:<< 和 >> 中,
..........
bool operator<<(const Source &input)
{
return !(stream << input).fail();
}
template<typename InputStreamable>
bool operator>>(InputStreamable &output)
{
return !is_pointer<InputStreamable>::value &&
stream >> output &&
(stream >> std::ws).eof();
}
bool operator>>(std::string &output)
{
#if defined(BOOST_NO_STRINGSTREAM)
stream << '\0';
#endif
output = stream.str();
return true;
}
..........
当然,其中的stream是一个经过处理的stringstream,让它可以适应不同的编译器。从这个实现可以看到,我们似乎没有地方可以插入自己的 >> hex >> 之类的代码。也许可以通过对传入的output类型做一个wrapper来实现,但是如果有这个功夫,那又何苦,还不如直接用stringstream更快捷。
分享到:
相关推荐
boost::lexical_cast用法示例,包含数值转字串,字串转数值以及相应的异常处理代码
Boost库提供了一个非常实用的工具——`lexical_cast`,它简化了这个过程,使得转换更加安全和方便。本篇将详细介绍Boost库中的`lexical_cast`以及如何利用它进行字符串与数值之间的转换。 `lexical_cast`是Boost库...
在本项目"lex_lexical_analysis.zip"中,开发者使用了Flex工具来实现C语言的词法分析。Flex是一个广泛使用的开源工具,它允许用户通过定义规则来生成词法分析器,这些规则定义了输入字符串如何被识别为特定的标记。 ...
如果转换过程中出现错误,如字符串不能被解析为有效的数值,或者数值超出目标类型的范围,它会抛出一个`boost::bad_lexical_cast`异常。这样,程序员可以捕获这个异常并采取适当的错误处理措施,而不是让程序...
本文将详细介绍如何下载、安装 Boost,并通过一个简单的试用示例来展示 Boost 中 `lexical_cast` 的使用。 首先,我们来了解如何下载 Boost。你可以访问官方网站 [www.boost.org](http://www.boost.org) 获取最新的...
本项目"lexical_analysis_python_"旨在提供一个自定义的词法分析器,帮助用户理解和操作Python源代码的词法结构。 Python的`tokenize`模块是Python标准库的一部分,它基于正规表达式定义了Python源代码的语法元素,...
标题“compiler_lexical_analyzer”和描述中的关键词都指向了编译器的词法分析器,这是编译原理中的一个重要组成部分。词法分析器,也称为扫描器或词法分析程序,是编译器前端的第一个阶段,它的主要任务是从源代码...
在“lexical_analysis”这一主题中,我们将深入探讨词法分析在编译器设计中的重要性及其工作原理。 词法分析是编译过程的起始步骤,其目标是将源代码转换为一系列有意义的符号,称为标记(Token)。这些标记是程序...
本项目“bianyiqi.rar_bianyiqi_simple lexical_编译 语法分析_编译器_语义分析”旨在构建一个简单的编译器,其核心功能包括词法分析、语法分析和语义分析,最终目的是生成汇编代码。 首先,我们来了解一下词法分析...
在本项目"**C_language_lexical_analyzer.rar_vc6.0**"中,开发者使用C++编程语言构建了一个针对C语言的词法分析器,并且该分析器是在Visual C++ 6.0(简称vc6.0)环境下开发的。vc6.0是一款经典的Microsoft编译器,...
在本文中,我们将深入探讨如何实现一个词法分析器(Analyseur Lexical)使用C++编程语言。词法分析是编译器设计中的一个重要步骤,它负责将源代码文本分解为一系列有意义的符号,即Token,为后续的语法分析阶段提供...
python写一个简易的词法分析器,比上次的代码加上了一个交互界面,此为demo,可以根据这个代码修改成完整的词法分析器。
boost基本入门使用示例,简单,一看就懂! 部分代码如下: int a = lexical_cast("123"); double b = lexical_cast("123.0123456789"); string s0 = lexical_cast(a);
在本案例中,"词法分析1"可能是一个词法分析器的实现,或者是关于词法分析的一个示例或教程。"help.txt"文件提供了有关如何使用该词法编译器的详细说明。通常,这样的帮助文件会包含如何运行程序、输入格式、预期的...
在编程语言的世界里,编译器是至关重要的工具,它将高级语言转化为机器可以理解的指令。本项目涉及的核心知识点是“编译原理”,具体包括词法分析和语法分析两个阶段,使用的是一种名为bell5op的语法分析器。...
g++ lex.cpp -I$BOOST_INCLUDE -L$BOOST_LIB -lboost_lexical_cast -o lex ``` - 运行: ``` ./lex ``` 输出应为`The number is: 123`。 #### 五、总结 通过上述步骤,我们不仅成功地安装了Boost库,还验证...
用MFC实现的C语言词法分析器,是学习编译原理的不错的参考资料,本程序用VS2010编写,此词法分析程序可分析出C语言中: 标识符(以字母或下划线开头,后面可以是数字字母或下划线) 字符串常量 字符常量 ...
The transformation of the formal grammar to the uncertain automata, the content of the lexical analyzer
这段代码演示了如何使用`boost::lexical_cast`进行类型转换,同时处理了转换过程中可能出现的异常情况。 #### 五、编译特定子库 除了直接使用源码外,还可以选择性地编译Boost库中的某些子库。这有助于减少编译时间...
原来我总结过c++的一些类型转换函数:static_cast,...polymorphic_downcast,numeric_cast和lexical_cast。设计的主要原则是:代码必须准确运行而且清晰的表达作者的意图。polynorphic_cast提供更好的类型安全性。在c