江苏快三开奖结果

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

江苏快三开奖结果LUMANMAN,CHANGXIUYUAN,WOMENBUNENGMEIYOUQIAN

boost的lexical_cast --數據類型轉

ZHU:ZHUANZAIQINGBAOZHENGWENZHANGWANZHENGXING

一、介紹

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

Target lexical_cast(Source arg)

LIRU:

#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;
}

江苏快三开奖结果FEICHANGRONGYIBA,JIANDANYESHITADEYOUSHIZHIYI。

二、異常

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;
    }
}

江苏快三开奖结果DANGstrWEIABCDSHI, WUFAZHUANCHENGPIPAOCHUYICHANG SHUCHU

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

三、一個小例子

江苏快三开奖结果WEILEJIASHENDAJIALIJIE XIAMIANSHIYONGlexical_castSHIXIANYIGEJIANDANDEWENBENSHURUSHIFOUWEIZHIDINGLEIXINGDEXIAOCHENGXU

#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;    
}

CESHIJIEGUO:

測試: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_infoDEJUTIYONGFASHI:E.source_type().name()JIUKENENGDAOLEIXINGMING。

江苏快三开奖结果HEXINZHUANHUANBUFEN,YONGDESHILIUDEGAINIAN,CONGLIUNEISHUJUDESHENGYUQINGKUANGYULIUZHUANHUANCHENGGONGYUFOUQINGKUANGLAIPANDUANCAOZUOSHIFOUCHENGGONG。ZAIBUJIAYUSHIZHELIJIUXIANGYIGEHEIHEZI。

        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;
        }

江苏快三开奖结果JINTIGONGGAIRUKOU,JUTISHIXIANBEIFENGZAIdetailYULIMIAN。

    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;
    }

ZUIHOU, WOMENKEYIFAXIAN

bad_lexical_cast(typeid(Target), typeid(Source)

YUSHANGMIAN

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

ZHIJIANDEQUBIE,ZAIWOKANLAISHIXIEDAOLE,BUGUOBUYINGXIANG,YESUANSHIGEBUSUANbugDEbug

五、總結

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

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


只有注冊用戶登錄后才能發表評論。

網站導航:                管理


<2015年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

導航

統計

公告

現在時刻

IM在線情況:

常用鏈接

留言簿(33)

隨筆分類(220)

隨筆檔案(164)

相冊

技術

友情鏈接

最新隨筆

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜