青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,長修遠,我們不能沒有錢
隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
數據加載中……

boost的lexical_cast --數據類型轉

注:轉載請保證文章完整性

一、介紹

lexical_cast是boost中一個非常有用,常用,好用的庫,我現在的小數據轉換用的都是lexical_cast lexical_cast最大的特點是安全,包括長度安全,類型安全。 下面我來介紹下lexical_cast的基本使用方法。

Target lexical_cast(Source arg)

例如:

#include <boost/lexical_cast.hpp>           //lexical_cast的頭文件

using namespace std;                        //stl的域
using namespace boost;                      //boost的域

int main() {
    const double PI = 3.1415926535;
    string str;
    str = lexical_cast<string>(PI);
    cout << str; 
    return 0;
}

非常容易吧,簡單也是他的優勢之一。

二、異常

lexical_cast在執行失敗時會拋出異常bad_lexical_cast 上面的例子改為:

#include <boost/lexical_cast.hpp>           //lexical_cast的頭文件

using namespace std;                        //stl的域
using namespace boost;                      //boost的域

int main() {
    try {
        string str = "3.1415926535";
        double PI = lexical_cast<double>(str);
        cout << PI; 
        return 0;
    } catch( bad_lexical_cast& E ) {
        cout << E.what() << endl;
    }
}

當str為ABCD時, 無法轉成PI拋出異常 輸出

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

三、一個小例子

為了加深大加理解 下面使用lexical_cast實現一個簡單的文本輸入是否為指定類型的小程序

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

using namespace std;                       //stl的域
using namespace boost;                     //boost的域

template<typename _T, typename _R>
bool isElement(_R r) {
    try {
        lexical_cast<_T>(r);                
        return true;                        //轉換成功
    } catch(...) {
        return false;
    }
}

int main() {
    try {
        if( isElement<double>("3.14d159") )
            cout << "YES" << endl;
        else
            cout << "NO" << endl;

    } catch( bad_lexical_cast& E ) {
        cout << E.what() << endl;
    }
    return 0;    
}

測試結果:

測試:isElement<double>("3.14d159") 輸出:NO
測試:isElement<string>("3.14d159") 輸出:YES
測試:isElement<long>("314159")     輸出:YES
測試:isElement<long>("31.4159")    輸出:NO
測試:isElement<char>("314159")     輸出:NO

四、源碼分析

#ifdef BOOST_NO_STRINGSTREAM // 我們知道stringstream和strstream分別
                             // 是string和char*結構, lexical_cast考慮很全面的。
    #include <strstream>
#else
    #include <sstream>
#endif

// bad_lexical_cast是bad_cast的繼承,所以很標準,支持和擴充性都很好。
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 &s, const std::type_info &t ) :
            source(&s), target(&t)
        {
        }

        //提供了兩個返回type_info的函數,為我們跟蹤調試類形轉換起到很好的做用。
        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;
    };

type_info的具體用法是:E.source_type().name()就可能到類型名。

核心轉換部分,用的是留的概念,從流內數據的剩余情況與流轉換成功與否情況來判斷操作是否成功。在不加域時這里就像一個黑盒子。

        bool operator<<(const Source &input)
        {
            return !(stream << input).fail();
        }

        template<typename InputStreamable>
        bool operator>>(InputStreamable &output)
        {
            return !is_pointer<InputStreamable>::value &&
                    stream >> output &&
                    (stream >> std::ws).eof();
        }

        bool operator>>(std::string &output)
        {
            #if defined(BOOST_NO_STRINGSTREAM)
            stream << '\0';
            #endif
            output = stream.str();
            return true;
        }

僅提供該入口,具體實現被封在detail域里面。

    template<typename Target, typename Source>
    Target lexical_cast(Source arg)
    {
        detail::lexical_stream<Target, Source> interpreter;
        Target result;

        if(!(interpreter << arg && interpreter >> result))
            throw_exception(bad_lexical_cast(typeid(Target), typeid(Source))); //拋出異常錯誤,
        return result;
    }

最后, 我們可以發現

bad_lexical_cast(typeid(Target), typeid(Source)

與上面

bad_lexical_cast(const std::type_info &s, const std::type_info &t) 
        :source(&s), target(&t)

之間的區別,在我看來是寫倒了,不過不影響,也算是個不算bug的bug

五、總結

lexical_cast是強大的,但不是萬能的,但在很多情況下他有著獨特的優點,安全方便快捷!!!

posted on 2017-10-14 16:26 Khan 閱讀(834) 評論(0)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺開發

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久精品2019中文字幕神马| 香蕉久久久久久久av网站| 欧美中文字幕在线| 亚洲自拍电影| 国产精品系列在线| 久久福利资源站| 午夜精品视频一区| 国产欧美一区二区精品仙草咪 | 久久福利资源站| 国产精品入口| 久久国产精品99国产精| 欧美一区日韩一区| 在线观看视频欧美| 亚洲国产91精品在线观看| 欧美黑人多人双交| 亚洲伊人久久综合| 欧美在线一区二区| 亚洲精美视频| 亚洲天堂成人在线观看| 国产日韩精品一区二区三区| 久久综合久久综合久久| 欧美电影在线免费观看网站| 一区二区激情| 欧美一区二区三区日韩视频| 亚洲夫妻自拍| 亚洲天堂av高清| 有坂深雪在线一区| 99精品国产高清一区二区| 国产伦精品一区二区三区高清版 | 亚洲一级特黄| 欧美一区成人| 99re成人精品视频| 香蕉亚洲视频| 亚洲麻豆av| 午夜日韩激情| 夜夜爽av福利精品导航| 性久久久久久久久| 亚洲精品网站在线播放gif| 在线亚洲伦理| 亚洲激精日韩激精欧美精品| 中文欧美日韩| 亚洲人成精品久久久久| 亚洲男人第一av网站| 亚洲激情网站| 欧美一区二区三区视频免费播放| 亚洲日本va午夜在线电影| 午夜久久99| 亚洲午夜激情免费视频| 美女成人午夜| 久久欧美肥婆一二区| 欧美日韩国产免费| 欧美成ee人免费视频| 国产精品一区二区三区四区| 亚洲区欧美区| 亚洲国产你懂的| 久久精品国产99国产精品澳门| 亚洲女与黑人做爰| 欧美成黄导航| 嫩草国产精品入口| 国自产拍偷拍福利精品免费一| 在线一区二区视频| 一区二区黄色| 欧美乱妇高清无乱码| 欧美成人免费一级人片100| 国产一区二区三区av电影| 国产精品99久久99久久久二8| 99ri日韩精品视频| 欧美成人激情在线| 欧美福利视频| 亚洲黄色成人| 免费观看30秒视频久久| 快播亚洲色图| 国产午夜精品在线| 午夜亚洲性色视频| 久久福利毛片| 韩国av一区| 久久久天天操| 免费观看不卡av| 精品电影在线观看| 老司机久久99久久精品播放免费| 另类图片国产| 亚洲国产欧美不卡在线观看| 免费成人av在线| 亚洲国产女人aaa毛片在线| 亚洲日本黄色| 欧美日本一道本| 一区二区日韩欧美| 亚洲深夜福利视频| 国产精品爽爽爽| 久久国产精品久久久| 久久亚洲精选| 亚洲精品欧美日韩专区| 欧美日本一道本在线视频| 中文精品视频| 久久久综合香蕉尹人综合网| 狠狠色伊人亚洲综合网站色| 久久久亚洲影院你懂的| 亚洲精品一区在线观看香蕉| 亚洲午夜一区| 狠狠色丁香久久婷婷综合_中| 欧美成在线视频| 亚洲一二三四区| 美日韩精品免费观看视频| 亚洲精品在线观看视频| 国产精品久久久久久久久| 久久爱www久久做| 最新日韩av| 午夜精品成人在线| 在线观看久久av| 欧美日韩一区二区精品| 性欧美暴力猛交69hd| 亚洲国产欧美日韩精品| 午夜精品999| 亚洲精选在线| 好吊妞这里只有精品| 欧美人与禽猛交乱配| 欧美怡红院视频| 亚洲开发第一视频在线播放| 久久久久久久久蜜桃| 国产精品99久久久久久久vr| 国产欧美日韩不卡| 欧美剧在线免费观看网站| 久久精品国产免费观看| 一区二区三区高清视频在线观看| 美腿丝袜亚洲色图| 久久国产精品99国产| 中国日韩欧美久久久久久久久| 海角社区69精品视频| 欧美性猛交xxxx乱大交蜜桃| 牛人盗摄一区二区三区视频| 欧美在线观看天堂一区二区三区| 亚洲精品视频免费在线观看| 免费看av成人| 久久岛国电影| 午夜欧美视频| 亚洲欧美国产精品va在线观看| 日韩一级精品| 91久久精品美女| 尤物99国产成人精品视频| 国产视频一区欧美| 国产欧美日韩三区| 国产精品日韩一区二区| 欧美日韩一区二区在线视频| 欧美日韩aaaaa| 欧美日韩国产一区二区| 欧美大色视频| 欧美激情久久久| 欧美福利在线观看| 麻豆精品视频| 蜜桃av综合| 免费视频一区| 欧美国产免费| 欧美日本一区二区三区| 欧美日韩成人激情| 欧美日精品一区视频| 欧美视频观看一区| 国产精品国产福利国产秒拍| 国产精品久久久久9999高清| 欧美视频一区二区在线观看| 国产精品h在线观看| 国产精品国产三级国产a| 国产精品国产三级国产aⅴ入口 | 国产精品久久久久久久免费软件| 欧美午夜电影完整版| 国产精品日韩一区二区| 国产视频一区在线观看一区免费| 国产午夜精品视频| 亚洲高清av| 99成人精品| 亚洲尤物精选| 久久精品九九| 欧美激情亚洲激情| 亚洲美女在线看| 亚洲一区免费网站| 久久国产精品毛片| 欧美成人按摩| 国产精品www色诱视频| 国产精品日日摸夜夜摸av| 国产主播喷水一区二区| 亚洲电影天堂av| 夜久久久久久| 久久精品成人欧美大片古装| 欧美激情精品久久久久| 亚洲最黄网站| 久久精品成人| 欧美日韩国产区| 国产亚洲免费的视频看| 亚洲欧洲日夜超级视频| 亚洲男女毛片无遮挡| 蜜桃久久精品乱码一区二区| 亚洲免费观看高清在线观看| 欧美中文字幕在线视频| 欧美高清视频一区二区| 国产亚洲第一区| 99精品久久久| 久久综合激情| 亚洲主播在线| 欧美精品福利| 黄色亚洲精品| 亚洲欧美日本日韩|