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

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 閱讀(826) 評論(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>
            麻豆精品网站| 久久人体大胆视频| 日韩午夜av电影| 欧美日韩伊人| 欧美专区在线| 久久免费黄色| 日韩系列在线| 亚洲欧美国产日韩中文字幕| 国内精品国产成人| 亚洲国产精品热久久| 欧美日韩精品一区二区三区四区 | 国产精品免费一区二区三区观看| 亚洲欧美中日韩| 久久亚洲视频| 亚洲男人的天堂在线aⅴ视频| 性做久久久久久久久| 91久久精品视频| 中文在线一区| 永久域名在线精品| 一区二区动漫| 亚洲国产免费看| 亚洲一区二区三区在线观看视频 | 亚洲视频播放| 欧美专区在线观看| 一道本一区二区| 久久成人18免费观看| 夜夜夜久久久| 久久久噜噜噜久久人人看| 亚洲图片欧洲图片av| 久久亚洲图片| 欧美在线视频不卡| 欧美日本高清视频| 欧美成人dvd在线视频| 欧美日韩直播| 亚洲高清视频在线| 国内精品免费在线观看| 一区二区免费在线视频| 亚洲欧洲在线一区| 久久丁香综合五月国产三级网站| 一区二区三区四区五区视频 | 欧美 日韩 国产精品免费观看| 欧美一区二区在线播放| 欧美日韩色一区| 亚洲成色精品| ●精品国产综合乱码久久久久 | 久久中文在线| 国产视频亚洲精品| 亚洲天堂av综合网| 日韩香蕉视频| 欧美韩日一区| 亚洲电影免费观看高清完整版在线观看| 国产精品蜜臀在线观看| 日韩视频在线一区二区三区| 亚洲欧洲一区| 欧美国产专区| 91久久久久久久久久久久久| 最新国产精品拍自在线播放| 美女视频黄a大片欧美| 老司机午夜免费精品视频| 国产一区二区久久精品| 欧美亚洲一区二区在线观看| 性欧美在线看片a免费观看| 国产精品草莓在线免费观看| 9l视频自拍蝌蚪9l视频成人 | 国产美女诱惑一区二区| 亚洲一级免费视频| 欧美一区二区观看视频| 国产精品视频999| 欧美在线播放一区二区| 久久免费精品视频| 亚洲第一区在线| 欧美不卡视频一区| 亚洲三级色网| 亚洲综合色噜噜狠狠| 国产伦精品一区二区| 午夜精品成人在线| 久久婷婷国产麻豆91天堂| 亚洲第一视频| 欧美精品一区二区三| 在线综合视频| 久久久亚洲精品一区二区三区| 激情综合色综合久久综合| 免费在线欧美视频| 一区二区福利| 久久亚洲精品视频| 亚洲三级观看| 国产精品亚洲成人| 久久五月天婷婷| 亚洲免费高清| 午夜日韩av| 亚洲国产婷婷香蕉久久久久久| 欧美日本高清| 久久精品免费电影| 亚洲精品精选| 久久免费视频网| 日韩小视频在线观看| 国产精品尤物| 欧美高清你懂得| 欧美一区二区三区男人的天堂| 欧美激情自拍| 久久久久久久久久久成人| 亚洲精品一区二区三区在线观看| 国产精品久久网站| 欧美成ee人免费视频| 午夜亚洲福利| 亚洲毛片网站| 欧美大片免费| 久久国产精品99国产| 夜夜爽夜夜爽精品视频| 激情文学一区| 国产精品视频成人| 欧美精品电影在线| 久久三级视频| 午夜在线视频一区二区区别 | 久久久www成人免费精品| av不卡在线| 亚洲国产精品视频一区| 国产日韩在线一区| 国产精品成人va在线观看| 女同性一区二区三区人了人一| 性做久久久久久久免费看| 一本色道久久88综合亚洲精品ⅰ| 欧美成人精品高清在线播放| 久久国产精品高清| 亚洲欧美精品一区| 亚洲一级影院| 宅男精品视频| 99国产精品久久久久久久久久 | 亚洲精品国产日韩| 亚洲国产精品123| 狠狠色综合播放一区二区| 国产精品尤物| 国产亚洲视频在线观看| 国产精品乱码妇女bbbb| 欧美图区在线视频| 欧美日韩网址| 欧美性猛交xxxx乱大交退制版 | 久久精品国内一区二区三区| 小黄鸭视频精品导航| 亚洲男女自偷自拍图片另类| 亚洲一区二区三区中文字幕| 亚洲色图制服丝袜| 亚洲视频网站在线观看| 在线亚洲激情| 午夜精品久久久99热福利| 西瓜成人精品人成网站| 午夜一区二区三区在线观看| 午夜久久久久久| 久久精品中文字幕一区| 久久婷婷色综合| 欧美成人免费小视频| 欧美另类在线观看| 国产精品免费在线| 国产性色一区二区| 狠狠噜噜久久| 亚洲精品国精品久久99热一| 日韩一区二区免费高清| 亚洲自拍偷拍麻豆| 久久精品免费播放| 欧美国产大片| 99re热这里只有精品免费视频| 亚洲婷婷综合久久一本伊一区| 亚洲免费在线精品一区| 欧美在线一区二区| 欧美91大片| 国产精品日韩一区| 在线不卡免费欧美| 中日韩美女免费视频网站在线观看| 亚洲综合精品一区二区| 久久婷婷国产麻豆91天堂| 亚洲国产综合在线| 亚洲欧美日韩综合aⅴ视频| 久久亚洲不卡| 国产精品成人观看视频国产奇米| 国产一区二区看久久| 一本一本久久a久久精品牛牛影视| 午夜亚洲一区| 亚洲国产精品v| 午夜精品福利一区二区蜜股av| 另类天堂av| 国产欧美日韩精品专区| 亚洲日本va午夜在线电影| 欧美一区二区黄| 亚洲精品视频在线播放| 久久狠狠亚洲综合| 欧美午夜精品久久久久久孕妇 | 国产精品福利在线| 亚洲国产精品ⅴa在线观看| 午夜欧美精品| 亚洲精品四区| 麻豆av一区二区三区| 国产精品一区在线观看你懂的| 亚洲日本成人网| 久久综合电影一区| 亚洲专区免费| 欧美视频一二三区| 99视频精品在线| 亚洲第一黄色| 久久蜜桃精品| 国内精品久久久久影院优|