`
zhangyafei_kimi
  • 浏览: 265609 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

boost.lexical_cast源码整理和使用说明

阅读更多

Source

#include <cstddef>

#include <string>

#include <typeinfo>

//#include <boost/config.hpp>

#include <boost/limits.hpp>

#include <boost/throw_exception.hpp>

#include <boost/type_traits/is_pointer.hpp>

#include <sstream>

//

namespace kimi_boost

{

// exception used to indicate runtime lexical_cast failure

class bad_lexical_cast : public std::bad_cast

{

public:

bad_lexical_cast() :

source(&typeid(void)), target(&typeid(void))

{

}

bad_lexical_cast(

const std::type_info &source_type,

const std::type_info &target_type) :

source(&source_type), target(&target_type)

{

}

const std::type_info &source_type() const

{

return *source;

}

const std::type_info &target_type() const

{

return *target;

}

virtual const char *what() const throw()

{

return "bad lexical cast: "

"source type value could not be interpreted as target";

}

virtual ~bad_lexical_cast() throw()

{

}

private:

const std::type_info *source;

const std::type_info *target;

};

namespace detail // stream wrapper for handling lexical conversions

{

template<typename Target, typename Source>

class lexical_stream

{

private:

typedef char char_type;

std::basic_stringstream<char_type> stream;

public:

lexical_stream()

{

stream.unsetf(std::ios::skipws);

if(std::numeric_limits<Target>::is_specialized)

stream.precision(std::numeric_limits<Target>::digits10 + 1);

else if(std::numeric_limits<Source>::is_specialized)

stream.precision(std::numeric_limits<Source>::digits10 + 1);

}

~lexical_stream()

{

}

//Source类型输入到流中

bool operator<<(const Source &input)

{

return !(stream << input).fail();

}

//把流转换为Target类型输出

template<typename InputStreamable>

bool operator>>(InputStreamable &output)

{

return !boost::is_pointer<InputStreamable>::value &&

stream >> output &&

stream.get() ==

std::char_traits<char_type>::eof();

}

//string特化

template<>

bool operator>>(std::string &output)

{

output = stream.str();

return true;

}

};//class lexical_stream

}//namespace detail

namespace detail

{

template<class T>

struct array_to_pointer_decay

{

typedef T type;

};

template<class T, std::size_t N>

struct array_to_pointer_decay<T[N]>

{

typedef const T * type;

};

}

template<typename Target, typename Source>

Target lexical_cast(const Source &arg)

{

typedef typename detail::array_to_pointer_decay<Source>::type NewSource;

detail::lexical_stream<Target, NewSource> interpreter;

Target result;

if(!(interpreter << arg && interpreter >> result))

boost::throw_exception(bad_lexical_cast(typeid(NewSource), typeid(Target)));

return result;

}

}

Test code

void kimi_lexical_cast_test()

{

try

{

int i=kimi_boost::lexical_cast<int>("4365");

float f=kimi_boost::lexical_cast<float>("234.546");

double d=kimi_boost::lexical_cast<double>("24534.546345");

std::string s=kimi_boost::lexical_cast<std::string>(24534.546345);

}

catch(kimi_boost::bad_lexical_cast& e)

{

cout<<e.what()<<endl;

}

try{

int i2=kimi_boost::lexical_cast<int>("0.335");

}

catch(kimi_boost::bad_lexical_cast& e)

{

cout<<"source type: "<<e.source_type().name()<<endl;

cout<<"target type: "<<e.target_type().name()<<endl;

cout<<e.what()<<endl;

}

}

Output

source type: char const *

target type: int

bad lexical cast: source type value could not be interpreted as target

分享到:
评论

相关推荐

    boost之lexical_cast之字符串转换成数值.rar_Boost_boost_字符串转换成数值

    Boost库提供了一个非常实用的工具——`lexical_cast`,它简化了这个过程,使得转换更加安全和方便。本篇将详细介绍Boost库中的`lexical_cast`以及如何利用它进行字符串与数值之间的转换。 `lexical_cast`是Boost库...

    boost::lexical_cast用法

    boost::lexical_cast用法示例,包含数值转字串,字串转数值以及相应的异常处理代码

    boost_下载,安装,试用

    本文将详细介绍如何下载、安装 Boost,并通过一个简单的试用示例来展示 Boost 中 `lexical_cast` 的使用。 首先,我们来了解如何下载 Boost。你可以访问官方网站 [www.boost.org](http://www.boost.org) 获取最新的...

    bianyiqi.rar_bianyiqi_simple lexical_编译 语法分析_编译器_语义分析

    本项目“bianyiqi.rar_bianyiqi_simple lexical_编译 语法分析_编译器_语义分析”旨在构建一个简单的编译器,其核心功能包括词法分析、语法分析和语义分析,最终目的是生成汇编代码。 首先,我们来了解一下词法分析...

    C_language_lexical_analyzer.rar_vc6.0

    在本项目"**C_language_lexical_analyzer.rar_vc6.0**"中,开发者使用C++编程语言构建了一个针对C语言的词法分析器,并且该分析器是在Visual C++ 6.0(简称vc6.0)环境下开发的。vc6.0是一款经典的Microsoft编译器,...

    Lexical-Compiler.zip_Help!_LEXical compiler_lexical

    词法分析是编程语言处理的...通过学习和使用"Lexical Compiler",开发者可以更好地理解编译器工作原理,提高编写和调试编译器相关工具的能力,这对于软件工程、编译原理研究或者编程语言设计等领域都是非常有价值的。

    Lexical-compiler.rar_LEXical compiler

    "Lexical-compiler.rar_LEXical compiler" 这个压缩包文件显然是针对词法编译器的,可能包含了实现词法分析功能的软件工具,以及相关的文档和示例。 首先,让我们深入了解一下词法分析器。词法分析器,或称为词法...

    myjava.zip_lexical+ parser

    本文将深入探讨一个名为“myjava.zip_lexical+ parser”的项目,该项目使用Java语言实现了一个编译器,包含了词法分析器、语法分析器,并能生成中间代码,体现了编译原理中的关键概念和技术。 首先,词法分析器...

    ll(1).rar_729ll.com_LL(1文法

    词法分析(Lexical Analysis)阶段,也称为扫描器或词法器,它将源代码分解成一个个称为标记(Token)的单位,这些标记是文法分析的基础。 语法分析(Syntax Analysis)阶段,即解析器,会使用LL(1)解析表来构建...

    lexical_cast:常规文字文本转换,例如以字符串表示的int,反之亦然

    #include &lt;boost/lexical_cast.hpp&gt; #include int num = 123; std::string strNum = boost::lexical_cast(num); ``` 同样,如果你想将字符串转换为整数,可以这样操作: ```cpp std::string input = "456"; int ...

    NFA.zip_Lexical Grammar_自动机

    The transformation of the formal grammar to the uncertain automata, the content of the lexical analyzer

    Boost学习笔记

    在字符串和文本处理方面,Boost 提供了 lexical_cast 工具,允许在不同数据类型之间进行安全且泛型的转换,替代了传统的 C 标准库中的转换函数,如 atoi 和 itoa。 Boost 的安装和配置相对简单。首先,你需要从官方...

    lex_lexical_analysis.zip

    在本项目"lex_lexical_analysis.zip"中,开发者使用了Flex工具来实现C语言的词法分析。Flex是一个广泛使用的开源工具,它允许用户通过定义规则来生成词法分析器,这些规则定义了输入字符串如何被识别为特定的标记。 ...

    C++“准”标准库Boost简介.pdf

    1. **类型转换** - Boost.lexical_cast提供了一种安全、便捷的在文本和数字间转换的方法。 2. **文本处理** - Boost.Tokenizer用于分割字符串,Boost.Regex支持正则表达式操作,而Boost.Spirit则是一个强大的解析器...

    NBuilder-Lexical.zip_MFC词法分析器_lexical mfc_nbuilder_编译原理 编号

    注释说明,还不能处理预处理命令33种运算符说明:,() [] .在界符中有,这里出 , ? : sizeof 也没给出11种分界符32种关键字程序使用转换表设计,运行速度快,本人还对每个能识别的符号进行了编号。本程序用VS2010 MFC ...

    cifafenxiqi.zip_ cifafenxiqi_lexical analyzer_词法_词法分析_词法分析程序

    写了一个词法分析器 ...经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。

    Beyond.the.C++.Standard.Library.An.Introduction.to.Boost.pdf

    Boost提供了多种类型转换工具,如`lexical_cast`和`polymorphic_cast`,它们提供了一种类型安全的方式来执行类型转换,避免了传统C风格的转换可能带来的风险。 3. 实用工具类(Utility Classes): Boost中的实用...

    CLPP在Linux上的移植

    #include &lt;boost/lexical_cast.hpp&gt; #include #include using namespace std; int main() { using boost::lexical_cast; string s = lexical_cast("hello,boost!"); cout ; return 0; } ``` - 编译: ``` ...

Global site tag (gtag.js) - Google Analytics