boost::lexical_cast

lexical_cast在boost庫中的聲明

lexical_cast定義在boost命名空間,使用時須要包含頭文件<boost/lexical_cast.hpp>.ios

lexical_cast由一組模版組成,不一樣的模版對應不一樣的數據類型轉換。下面列出主要的兩種。函數

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

        if (!boost::conversion::detail::try_lexical_convert(arg, result)) {
            boost::conversion::detail::throw_bad_cast<Source, Target>();
        }

        return result;
    }

    template <typename Target>
    inline Target lexical_cast(const char* chars, std::size_t count)
    {
        return ::boost::lexical_cast<Target>(
            ::boost::iterator_range<const char*>(chars, chars + count)
        );
    }

基本用法

int x = boost::lexical_cast<int>("100");           //字符串->整型 100
    long y = boost::lexical_cast<long>("2000");        //字符串->長整型 2000
    float pai = boost::lexical_cast<float>("3.14159"); //字符串->符點型 3.14159
    double e = boost::lexical_cast<double>("2.71828"); //字符串->雙精度符點型 2.71828
    double r = boost::lexical_cast<double>("1.414abcdefg", 5); //C字符串->雙精度符點型(只轉前5位) 1.141
    std::string str = boost::lexical_cast<std::string>(0.618); //雙精度符點型->字符串 0.61799999999999999
    std::string str2 = boost::lexical_cast<std::string>(0x10); //16進制數->字符串 16

注:字符串轉數字時,字符串中不能包含除數字之外的字符(表示指數的e/E除外)。例如,不能將"123L"、"0x100"這樣的字符串轉換成數字。測試

異常處理

當lexical_cast沒法執行轉換操做時會拋出異常boost::bad_lexical_cast。spa

lexical_cast在命名空間boost::conversion提供了不拋出異常的版本。.net

template <typename Target, typename Source>
inline bool try_lexical_convert(const Source& arg, Target& result)

template <typename Target, typename CharacterT>
inline bool try_lexical_convert(const CharacterT* chars, std::size_t count, Target& result)

該系列模板能夠用來測試是否能夠轉換成功。code

實現原理

lexical_cast 對轉換對象有以下要求:對象

  • 轉換起點對象是可流輸出的,即定義了 operator<<
  • 轉換終點對象是可流輸入的,即定義了 operator>>
  • 轉換終點對象必須是可缺省構造和可拷貝構造的

注:C++語言中的內建類型(int,double等)和std::string都知足以上的三個條件。對於自定義類,須要按照這三個條件進行分別實現。blog

自定義類支持lexical_cast

最主要的是定義輸入輸出操做符,同時可以使用缺省構造函數和拷貝構造函數。字符串

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

class DemoClass
{
public:
    
    std::string str;
};


//重載流輸出操做符,可用於轉換的起點
std::ostream &operator << (std::ostream &os, const DemoClass &obj)
{
    os << obj.str;
    return os;
}

//重載流輸入操做符,可用於轉換的終點
std::istream &operator >> (std::istream &is, DemoClass &obj)
{
    is >> obj.str;
    return is;
}

int main()
{
    DemoClass demoObj = boost::lexical_cast<DemoClass>("HelloWorld"); //demoObj.str = HelloWorld
    std::string demoStr = boost::lexical_cast<std::string>(demoObj);  //demoStr = HelloWorld
}

注:這裏轉換過程當中若是字符串中間出現空格好比"Hello World",將致使轉換失敗。緣由及解決辦法後續提供。get

C++11新標準 VS lexical_cast

C++11標準加強了字符串與數字的互操做性。新標準提供了一系列函數

字符串轉數字

  • stoi
  • stol
  • stoll
  • stof
  • stod

數字轉字符串

  • to_string

使用示例

assert(std::stoi(" 42 ") == 42);         //轉換int,容許有空格
    assert(std::stol("100L") == 100L);       //轉換long, 支持L等後綴
    assert(std::stol("1000 9") == 1000L);    //轉換long, 後面的被忽略
    assert(std::stod("3.14ispi") == 3.14);   //轉換double, 遇到無效的字符中止
    assert(std::to_string(776ul) == "776");  //轉換爲string

與boost::lexical_cast相比。C++11標準容許字符串裏出現非數字字符--會忽略起始的白空格,直到遇到沒法轉換的字符爲止。

lexical_cast不支持空格符緣由分析及解決辦法

緣由分析:http://blog.csdn.net/ugg/article/details/3381138

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息