一、概述
有时一个值要转换成为文本格式,如int代表 std::string,或者相反,一个std::string代表一个int数值。这样的转换是很普通的,如在内部程序运行中的数据和配置文件中的数据。
标准C和C++库提供了大量机制进行转换,它们在易用性,扩展性和安全性方面各有不同.
例如:C的函数 atoi(),atof()(在stdlib.h下)等有大量限制:
-
仅在一个方向进行转换:从文本转为内部数据类型,要进行相反的转换要对易用性和安全性做一个妥协,如sprintf()等,或者损失可移值性如 itoa()。
-
所支持的数据类型仅是内置数据类型的一个子集,如 int,long和 double。
-
所支持的类型不能以一种统一的形式进行扩展。如将字符串转为复数或实数。
标准C函数strtol()有相同的限制,但是提供好优雅的转换控制,然而这样的控制在很多时侯不需要或者没有用。scanf()函数家族提供了更好的控制,但缺乏安全性和易用性。
标准C++提供了stringstream类,它提供了大量用于任意类型文件的控制和转换,然而对于简单的的转换,stringstream显得太笨拙和难以理解。
lexical_cast()函数模板提供了一种可以将文本转换为任意其它类型一种简便、统一的方式,它的简便是表达式层面的简便。而更复杂、更精确的转换则推荐用stringstream完成。数字与数字之间的转换,boost::numeric_cast()则比lexical_cast更方便。
对于字符串格式化,包括stringstream,lexical_cast等比较可以参看 http://www.gotw.ca/publications/mill19.htm,它上面提供的示例是很有帮助的。
二、Examples
#include "stdafx.h"
#include <boost/lexical_cast.hpp>
#include <boost/foreach.hpp>
#include <iostream>
#include <vector>
using namespace std;
void log_message(const std::string&);
void log_errno(int yoko)
{
//log_message("Error" + boost::lexical_cast<std::string>(yoko)+":" + strerror((yoko)));
}
int main(int argc, char* argv[])
{
for (int i = 0; i < argc; i++)
{
cout << argv[i] << endl;
}
using boost::lexical_cast;
using boost::bad_lexical_cast;
vector<short>args;
while (*++argv)
{
try
{
args.push_back(lexical_cast<short>(*argv));
}
catch (bad_lexical_cast&)
{
args.push_back(0);
}
}
for (short s : args)
{
cout << s << endl;
}
return 0;
}