- 浏览: 265609 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
daknife:
谢谢你的这篇文章,让我大概了解了select的一部分底层原理。 ...
Linux-2.6.25 select系统调用源码分析 -
gjlzjb:
非常有用,谢谢哈。另外问下,您是否用过Pheonix Syst ...
Why Map/Reduce? -
zhangyafei_kimi:
canbo 写道请问,我怎么生成安装包,提供给其它用户安装呢? ...
下载最新的Google Chrome源码并编译 -
canbo:
请问,我怎么生成安装包,提供给其它用户安装呢?
下载最新的Google Chrome源码并编译
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
发表评论
-
The Elements of Programing Style
2009-08-09 18:26 1270把代码写清楚,别耍小聪明。 想干什么,讲的简单点、直接点。 只 ... -
6个变态的C语言Hello World程序
2009-06-01 09:37 807转载自:http://cocre.com/?p=914 下面 ... -
在VS2005中使用IBM Purify的注意事项
2009-05-12 12:24 3999Rational Purify 使用及分析实例可以见这里htt ... -
boost.pool源码整理和使用说明
2007-07-22 13:49 270Source #ifndef __KIMI_BOOST_PO ... -
一个STL风格的动态二维数组
2007-07-22 18:05 1530#ifndef __KIMI_BOOST_ARRAY2#def ... -
boost.any源码整理和使用说明
2007-08-24 22:44 2093Source #include <algorithm& ... -
boost.array源码整理和使用说明
2007-08-24 22:45 1293Source #include <cstddef> ... -
boost.BOOST_STATIC_ASSERT源码整理和使用说明
2007-08-24 22:49 1364Source #include <boost/conf ... -
boost.shared_ptr源码整理和使用说明
2007-08-24 22:51 4189Source #pragma once //share ... -
编译期判断类的继承性
2007-08-24 23:00 1109介绍一个雕虫小技:编译期判断类的继承性。具体来说就是类型U是否 ... -
boost.type_traits源码整理和使用说明(1)
2007-08-28 01:35 2079Introduction The Boost type-tr ... -
泛型快速排序
2007-08-28 03:20 945Source #ifndef kimi_quicksort ... -
C++ Meta Programming 和 Boost MPL(1)
2007-08-30 23:01 1605本系列全部转载自kuibyshev.bokee.com ... -
C++ Meta Programming 和 Boost MPL(2)
2007-08-30 23:02 1536本系列全部转载自kuibyshev.bokee.com ... -
C++ Meta Programming 和 Boost MPL(3)
2007-08-30 23:06 1528本系列全部转载自kuibyshev.bokee.com ... -
C++ Meta Programming 和 Boost MPL(4)
2007-08-30 23:07 1707本系列全部转载自kuibyshev.bokee.com ... -
泛型归并排序
2007-09-18 00:23 1213#define SENTINEL_CARD (-1) # ... -
泛型插入排序
2007-09-18 00:25 1210#pragma once #include <iter ... -
boost.tuple源码整理和使用说明
2007-10-07 23:13 1601Introduction A tuple (or n-tup ... -
才发现VC中也可以检测内存泄漏
2009-03-30 14:54 1381#include <stdio.h> ...
相关推荐
Boost库提供了一个非常实用的工具——`lexical_cast`,它简化了这个过程,使得转换更加安全和方便。本篇将详细介绍Boost库中的`lexical_cast`以及如何利用它进行字符串与数值之间的转换。 `lexical_cast`是Boost库...
boost::lexical_cast用法示例,包含数值转字串,字串转数值以及相应的异常处理代码
本文将详细介绍如何下载、安装 Boost,并通过一个简单的试用示例来展示 Boost 中 `lexical_cast` 的使用。 首先,我们来了解如何下载 Boost。你可以访问官方网站 [www.boost.org](http://www.boost.org) 获取最新的...
本项目“bianyiqi.rar_bianyiqi_simple lexical_编译 语法分析_编译器_语义分析”旨在构建一个简单的编译器,其核心功能包括词法分析、语法分析和语义分析,最终目的是生成汇编代码。 首先,我们来了解一下词法分析...
在本项目"**C_language_lexical_analyzer.rar_vc6.0**"中,开发者使用C++编程语言构建了一个针对C语言的词法分析器,并且该分析器是在Visual C++ 6.0(简称vc6.0)环境下开发的。vc6.0是一款经典的Microsoft编译器,...
词法分析是编程语言处理的...通过学习和使用"Lexical Compiler",开发者可以更好地理解编译器工作原理,提高编写和调试编译器相关工具的能力,这对于软件工程、编译原理研究或者编程语言设计等领域都是非常有价值的。
"Lexical-compiler.rar_LEXical compiler" 这个压缩包文件显然是针对词法编译器的,可能包含了实现词法分析功能的软件工具,以及相关的文档和示例。 首先,让我们深入了解一下词法分析器。词法分析器,或称为词法...
本文将深入探讨一个名为“myjava.zip_lexical+ parser”的项目,该项目使用Java语言实现了一个编译器,包含了词法分析器、语法分析器,并能生成中间代码,体现了编译原理中的关键概念和技术。 首先,词法分析器...
词法分析(Lexical Analysis)阶段,也称为扫描器或词法器,它将源代码分解成一个个称为标记(Token)的单位,这些标记是文法分析的基础。 语法分析(Syntax Analysis)阶段,即解析器,会使用LL(1)解析表来构建...
#include <boost/lexical_cast.hpp> #include int num = 123; std::string strNum = boost::lexical_cast(num); ``` 同样,如果你想将字符串转换为整数,可以这样操作: ```cpp std::string input = "456"; int ...
The transformation of the formal grammar to the uncertain automata, the content of the lexical analyzer
在字符串和文本处理方面,Boost 提供了 lexical_cast 工具,允许在不同数据类型之间进行安全且泛型的转换,替代了传统的 C 标准库中的转换函数,如 atoi 和 itoa。 Boost 的安装和配置相对简单。首先,你需要从官方...
在本项目"lex_lexical_analysis.zip"中,开发者使用了Flex工具来实现C语言的词法分析。Flex是一个广泛使用的开源工具,它允许用户通过定义规则来生成词法分析器,这些规则定义了输入字符串如何被识别为特定的标记。 ...
1. **类型转换** - Boost.lexical_cast提供了一种安全、便捷的在文本和数字间转换的方法。 2. **文本处理** - Boost.Tokenizer用于分割字符串,Boost.Regex支持正则表达式操作,而Boost.Spirit则是一个强大的解析器...
注释说明,还不能处理预处理命令33种运算符说明:,() [] .在界符中有,这里出 , ? : sizeof 也没给出11种分界符32种关键字程序使用转换表设计,运行速度快,本人还对每个能识别的符号进行了编号。本程序用VS2010 MFC ...
写了一个词法分析器 ...经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。
Boost提供了多种类型转换工具,如`lexical_cast`和`polymorphic_cast`,它们提供了一种类型安全的方式来执行类型转换,避免了传统C风格的转换可能带来的风险。 3. 实用工具类(Utility Classes): Boost中的实用...
#include <boost/lexical_cast.hpp> #include #include using namespace std; int main() { using boost::lexical_cast; string s = lexical_cast("hello,boost!"); cout ; return 0; } ``` - 编译: ``` ...