Boost.Lexical_Cast用法小结

Lexical_Cast是Boost库中的一个小库。主要用于简单的数值和文本(字面量)间的相互转换。重要的有三个——lexical_cast,try_lexical_convert,bad_lexical_cast。其中,bad_lexical_cast继承于std::bad_cast,用于在转化失败时抛出异常。如果需要的是数值之间的转换,那么应该使用numeric_cast


传统的C风格的转换函数的只有单向转换,且仅限原生的一个子集(int,double,long)


sprintf使用不方便且向安全性进行了妥协,
itoa等函数并不是标准函数,又缺少了轻便性。
strtol又提供了太过于强大的转换过程的控制,而大部分时间又不会需要。


C++标准库提供的stringstream来处理此类问题,既会使用额外变量,也让语义显得模糊,蹩脚。


lexical_cast的目的就是找到一种比较好的方式,避免前两种风格的转换函数的缺陷。


一个简单样例

#include <boost/lexical_cast.hpp>
#include <vector>

int main(int /*argc*/, char * argv[])
{
    using boost::lexical_cast;
    using boost::bad_lexical_cast;

    std::vector<short> args;

    while (*++argv)
    {
        try
        {
            args.push_back(lexical_cast<short>(*argv));
        }
        catch(const bad_lexical_cast &)
        {
            args.push_back(0);
        }
    }

    // ...
}

lexical_cast有两种函数重载。


第一种是简单的对指定类型的全局转换

template<typename Target, typename Source>
  Target lexical_cast(const Source& arg);

第二种使用于字符类型转换到目的类型的部分转换

template <typename Target>
  Target lexical_cast(const AnyCharacterType* chars, std::size_t count);

实际上,lexical_cast的实现是:

template <typename Target, typename Source>
inline Target lexical_cast(const Source &arg)
{
    Target result;

    if (!conversion::try_lexical_convert(arg, result))
        throw bad_lexical_cast();

    return result;
}

其实是使用try_lexical_convert进行转换,而try_lexical_convert又是使用stringstream进行转换。


lexical_cast的大多数简易的转换情况下效率极高,比c的sprintf和c++的stringsteam都高。


这就是lexical_cast的简单的用法小结。
以后有时间再分析源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值