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

xiaoguozi's Blog
Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習(xí)慣原本生活的人不容易改變,就算現(xiàn)狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預(yù)料,人們需要更細(xì)心的觀察別人,要隨時注意才能保護(hù)別人,因為他們未必知道自己要什么·····
01.#include <iostream>  
02.#include <list>  
03.#include <boost/any.hpp>  
04. 
05.typedef std::list<boost::any> list_any;  
06. 
07.//關(guān)鍵部分:可以存放任意類型的對象  
08.void fill_list(list_any& la)  
09.{      
10.    la.push_back(10);//存放常數(shù)   
11.    la.push_back( std::string("dyunze") );//存放字符串對象;注意la.push_back(“dyunze”)錯誤,因為會被當(dāng)錯字符串?dāng)?shù)組  
12.}  
13. 
14.//根據(jù)類型進(jìn)行顯示  
15.void show_list(list_any& la)  
16.{  
17.    list_any::iterator it;  
18.    boost::any anyone;  
19. 
20.    for( it = la.begin(); it != la.end(); it++ )  
21.    {     
22.        anyone = *it;  
23. 
24.        if( anyone.type() == typeid(int) )  
25.            std::cout<<boost::any_cast<int>(*it)<<std::endl;  
26.        else if( anyone.type() == typeid(std::string) )  
27.            std::cout<<boost::any_cast<std::string>(*it).c_str()<<std::endl;  
28.    }  
29.}  
30. 
31.int main()  
32.{  
33.    list_any la;  
34.    fill_list(la);  
35.    show_list(la);  
36. 
37.    return 0;  
38.} 
#include <iostream>
#include <list>
#include <boost/any.hpp>

typedef std::list<boost::any> list_any;

//關(guān)鍵部分:可以存放任意類型的對象
void fill_list(list_any& la)
{   
    la.push_back(10);//存放常數(shù)
    la.push_back( std::string("dyunze") );//存放字符串對象;注意la.push_back(“dyunze”)錯誤,因為會被當(dāng)錯字符串?dāng)?shù)組
}

//根據(jù)類型進(jìn)行顯示
void show_list(list_any& la)
{
    list_any::iterator it;
    boost::any anyone;

    for( it = la.begin(); it != la.end(); it++ )
    {   
        anyone = *it;

        if( anyone.type() == typeid(int) )
            std::cout<<boost::any_cast<int>(*it)<<std::endl;
        else if( anyone.type() == typeid(std::string) )
            std::cout<<boost::any_cast<std::string>(*it).c_str()<<std::endl;
    }
}

int main()
{
    list_any la;
    fill_list(la);
    show_list(la);

    return 0;
}

boost::any的優(yōu)點:

     對設(shè)計模式理解的朋友都會知道合成模式。因為多態(tài)只有在使用指針或引用的情況下才能顯現(xiàn),所以std容器中只能存放指針或引用(但實際上只能存放指針,無法存放引用,這個好像是c++的不足吧)。如:

     std::list<BaseClass*> mylist;

這樣,我們就要對指針?biāo)赶騼?nèi)容的生存周期操心(可能需要程序員適時刪除申請的內(nèi)存;但是由于存放指針,插入/刪除的效率高),而使用boost::any就可能避免這種情況,因為我們可以存放類型本身(當(dāng)然存放指針也可以)。這是boost::any的優(yōu)點之一。

    boost::any另一個優(yōu)點是可以存放任何類型。而前面提到的mylist只能存放BaseClass類指針以及其繼承類的指針。

boost::any的缺點:

    由于boost::any可以存放任何類型,自然它用不了多態(tài)特性,沒有統(tǒng)一的接口,所以在獲取容器中的元素時需要實現(xiàn)判別元素的真正類型,這增加了程序員的負(fù)擔(dān)。與面向?qū)ο缶幊趟枷胗行┟埽麄€標(biāo)準(zhǔn)c++模板庫何嘗不是如此,用那些牛人的話來說,是“有益補充”。

   總之,有利必有弊,沒有十全十美的。

  

分析并模仿boost::any:

     讀了一下boost::any的源代碼,并模仿一下其實現(xiàn)(相當(dāng)一部分時拷貝原代碼),下面是代碼(只包含必要功能)。

實現(xiàn)any的功能主要由三部分組成:
1)any類
2)真正保存數(shù)據(jù)的holder類及其基類placeholder
3)獲取真正數(shù)據(jù)的模板函數(shù)any_cast,類型轉(zhuǎn)換的功能。

view plaincopy to clipboardprint?
01.#include <iostream>  
02.#include <list>  
03.#include <cassert>  
04. 
05.//自定義的any類  
06.class any  
07.{  
08.public:  
09.      
10.    //保存真正數(shù)據(jù)的接口類  
11.    class placeholder  
12.    {  
13.    public:       
14.        virtual ~placeholder()  
15.        {  
16.        }  
17.    public:   
18. 
19.        virtual const std::type_info & type() const = 0;  
20.        virtual placeholder * clone() const = 0;      
21.    };  
22. 
23.    //真正保存和獲取數(shù)據(jù)的類。  
24.    template<typename ValueType>  
25.    class holder : public placeholder  
26.    {  
27.    public:           
28.        holder(const ValueType & value): held(value)  
29.        {  
30.        }  
31. 
32.    public:   
33. 
34.        virtual const std::type_info & type() const 
35.        {  
36.            return typeid(ValueType);  
37.        }  
38. 
39.        virtual placeholder * clone() const 
40.        {  
41.            return new holder(held);//使用了原型模式  
42.        }  
43. 
44.    public:   
45. 
46.        //真正的數(shù)據(jù),就保存在這里  
47.        ValueType held;  
48.    };  
49. 
50.public:  
51. 
52.    any(): content(NULL)     
53.    {         
54.    }  
55. 
56.    //模板構(gòu)造函數(shù),參數(shù)可以是任意類型,真正的數(shù)據(jù)保存在content中  
57.    template<typename ValueType>  
58.    any(const ValueType & value): content(new holder<ValueType>(value))  
59.    {  
60.    }    
61. 
62.    //拷貝構(gòu)造函數(shù)  
63.    any(const any & other)  
64.        : content(other.content ? other.content->clone() : 0)  
65.    {  
66.    }  
67. 
68.    //析構(gòu)函數(shù),刪除保存數(shù)據(jù)的content對象  
69.    ~any()  
70.    {  
71.        if(NULL != content)  
72.            delete content;  
73.    }  
74. 
75.private:  
76.    //一個placeholde對象指針,指向其子類folder的一個實現(xiàn)  
77.    // 即content( new holder<ValueType>(value) )語句  
78.    placeholder* content;  
79. 
80.    template<typename ValueType> friend ValueType any_cast(const any& operand);  
81.public:   
82. 
83.    //查詢真實數(shù)據(jù)的類型。  
84.    const std::type_info & type() const 
85.    {  
86.        return content ? content->type() : typeid(void);  
87.    }  
88.};  
89. 
90. 
91.//獲取content->helder數(shù)據(jù)的方法。用來獲取真正的數(shù)據(jù)  
92.template<typename ValueType>  
93.ValueType any_cast(const any& operand)  
94.{  
95.    assert( operand.type() == typeid(ValueType) );  
96.    return static_cast<any::holder<ValueType> *>(operand.content)->held;  
97.}  
98. 
99.//下代碼是使用示例  
100. 
101.typedef std::list<any> list_any;  
102. 
103.void fill_list(list_any& la)  
104.{      
105.    la.push_back(10);//存放常數(shù);調(diào)用了any的模板構(gòu)造函數(shù),下同  
106.    la.push_back( std::string("我是string") );//存放字符串對象;注意la.push_back(“dyunze”)錯誤,因為會被當(dāng)錯字符串?dāng)?shù)組  
107. 
108.    char* p = "我是常量區(qū)字符串a(chǎn)bc";  
109.    la.push_back(p);//可以存放指針,但要注意指針的失效問題  
110.}  
111. 
112.//根據(jù)類型進(jìn)行顯示  
113.void show_list(list_any& la)  
114.{  
115.    list_any::iterator it;  
116. 
117.    for( it = la.begin(); it != la.end(); it++ )  
118.    {     
119. 
120.        if( (*it).type() == typeid(int) )  
121.            std::cout<<any_cast<int>(*it)<<std::endl;  
122.        else if( (*it).type() == typeid(std::string) )  
123.            std::cout<<any_cast<std::string>(*it).c_str()<<std::endl;  
124.        else if( (*it).type() == typeid(char*) )  
125.            std::cout<<any_cast<char*>(*it)<<std::endl;  
126.    }  
127.}  
128. 
129.int main()  
130.{  
131.    list_any la;  
132.    fill_list(la);  
133.    show_list(la);  
134. 
135.    return 0;  
136.} 

 boost::any是一個很有趣的類,剛剛開始我還以為其就是一個variant類型,
能夠?qū)⑷我忸愋椭当4孢M(jìn)去,能夠以任意類型值讀出來,不過我錯了 :(
  boost::any的作者認(rèn)為,所謂generic type有三個層面的解釋方法:
  1.類似variant類型那樣任意進(jìn)行類型轉(zhuǎn)換,可以保存一個(int)5進(jìn)去,
    讀一個(string)"5"出來。Win下面的VARIANT類型是以一個巨大的
    union實現(xiàn)的類似功能,使用靈活但效率較低
  2.區(qū)別對待包含值的類型,保存一個(int)5進(jìn)去,不會被隱式轉(zhuǎn)換為
    (string)'5'或者(double)5.0,這樣效率較高且類型安全,
    不必?fù)?dān)心ambiguous conversions
  3.對包含值類型不加區(qū)別,例如把所有保存的值強制轉(zhuǎn)換為void *保存
    讀取時再有程序員判斷其類型。這樣效率雖最高但無法保證類型安全
  boost::any就選擇了第二層面的設(shè)計思路,它允許用戶將任意類型值保存
進(jìn)一個any類型變量,但內(nèi)部并不改變值的類型,并提供方法讓用戶在使用時
主動/被動進(jìn)行類型判斷。

  在實現(xiàn)方面,boost::any使用兩層內(nèi)部類placeholder和holder保存
實際類型的值。類placeholder只是一個接口,模板類holder是特定類型
的實現(xiàn)。其中type()方法獲取實際值類型,即typeid(ValueType);
clone()方法獲取值的拷貝return new holder(held);
  virtual const std::type_info & type() const
  virtual placeholder * clone() const
  其值的類型信息不象Win的VARIANT那樣以專門的字段保存,
而是通過模板參數(shù)形式靜態(tài)保存。這樣效率更高(僅在編譯期),

通用性更強(任何類型都可以,真正any)但靈活性不如VARIANT
  在進(jìn)行拷貝構(gòu)造/賦值/swap時,都直接將整個placeholder換掉,
這樣可以保證值類型的延續(xù)性。

  在使用方面,提供了主動/被動進(jìn)行類型檢測的方法。
  可以使用any::type()方法主動檢測值類型
bool is_int(const boost::any & operand)
{
    return operand.type() == typeid(int);
}
  也可以通過any_cast函數(shù)被動進(jìn)行檢測。此函數(shù)與C++中的*_cast
系列關(guān)鍵字有相同的語法規(guī)范,嘗試進(jìn)行類型轉(zhuǎn)換,如類型不匹配則對
指針轉(zhuǎn)換返回NULL,對引用轉(zhuǎn)換拋出boost::bad_any_cast異常
  boost::any str = string("12345");
  try
  {
    cout << boost::any_cast<int>(str) << endl;
  }
  catch(boost::bad_any_cast e)
  {
    cerr << e.what() << endl;
  }


  在應(yīng)用方面,any類型適合于類型不同但使用相關(guān)的值。如C++的...
形式的函數(shù)參數(shù)本事不是類型安全的,可以通過vector<any>改造之
然后在使用時檢測類型是否匹配,如可改造printf為
  void safe_printf(const char *format, const vector<any>& params)
  {
    int index = 0;
    for(const char *pch = format; *pch; pch++)
    {
      switch(*pch)
      {
        case '%':
        {
          switch(*++pch)
          {
            case 'i':
            case 'd':
            {
              if(params[index].type() == typeid(int) ||
                 params[index].type() == typeid(short))
              {
                ...
              }
              else
                throw ...
            }
          }
        }
        case '\':
        {
          ...
        }
        default:
        {
          putchar(*pch);
        }
      }
    }
  }

附:boost::any.hpp
#ifndef BOOST_ANY_INCLUDED
#define BOOST_ANY_INCLUDED

// what:  variant type boost::any
// who:   contributed by Kevlin Henney,
//        with features contributed and bugs found by
//        Ed Brey, Mark Rodgers, Peter Dimov, and James Curran
// when:  July 2001
// where: tested with BCC 5.5, MSVC 6.0, and g++ 2.95

#include <algorithm>
#include <typeinfo>

#include "boost/config.hpp"

namespace boost
{
    class any
    {
    public: // structors

        any()
          : content(0)
        {
        }

        template<typename ValueType>
        any(const ValueType & value)
          : content(new holder<ValueType>(value))
        {
        }

        any(const any & other)
          : content(other.content ? other.content->clone() : 0)
        {
        }

        ~any()
        {
            delete content;
        }

    public: // modifiers

        any & swap(any & rhs)
        {
            std::swap(content, rhs.content);
            return *this;
        }

        template<typename ValueType>
        any & operator=(const ValueType & rhs)
        {
            any(rhs).swap(*this);
            return *this;
        }

        any & operator=(const any & rhs)
        {
            any(rhs).swap(*this);
            return *this;
        }

    public: // queries

        bool empty() const
        {
            return !content;
        }

        const std::type_info & type() const
        {
            return content ? content->type() : typeid(void);
        }

#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
    private: // types
#else
    public: // types (public so any_cast can be non-friend)
#endif


        class placeholder
        {
        public: // structors
    
            virtual ~placeholder()
            {
            }

        public: // queries

            virtual const std::type_info & type() const = 0;

            virtual placeholder * clone() const = 0;
    
        };

        template<typename ValueType>
        class holder : public placeholder
        {
        public: // structors

            holder(const ValueType & value)
              : held(value)
            {
            }

        public: // queries

            virtual const std::type_info & type() const
            {
                return typeid(ValueType);
            }

            virtual placeholder * clone() const
            {

                return new holder(held);
            }

        public: // representation

            ValueType held;

        };

#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS

    private: // representation

        template<typename ValueType>
        friend ValueType * any_cast(any *);

#else

    public: // representation (public so any_cast can be non-friend)

#endif

        placeholder * content;

    };

    class bad_any_cast : public std::bad_cast
    {
    public:
        virtual const char * what() const throw()
        {
            return "boost::bad_any_cast: "
                   "failed conversion using boost::any_cast";
        }
    };

    template<typename ValueType>
    ValueType * any_cast(any * operand)
    {
        return operand && operand->type() == typeid(ValueType)
                    ? &static_cast<any::holder<ValueType> *>(operand->content)->held
                    : 0;
    }

    template<typename ValueType>
    const ValueType * any_cast(const any * operand)
    {
        return any_cast<ValueType>(const_cast<any *>(operand));
    }

    template<typename ValueType>
    ValueType any_cast(const any & operand)
    {
        const ValueType * result = any_cast<ValueType>(&operand);
        if(!result)
            throw bad_any_cast();
        return *result;
    }

}

// Copyright Kevlin Henney, 2000, 2001, 2002. All rights reserved.
//
// Permission to use, copy, modify, and distribute this software for any
// purpose is hereby granted without fee, provided that this copyright and
// permissions notice appear in all copies and derivatives.
//
// This software is provided "as is" without express or implied warranty.

#endif

posted on 2011-06-16 18:32 小果子 閱讀(875) 評論(0)  編輯 收藏 引用 所屬分類: C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一级理论性理论a| 亚洲高清资源综合久久精品| 日韩一级裸体免费视频| 欧美黄色视屏| 亚洲无线视频| 性欧美大战久久久久久久久| 国产性色一区二区| 免费视频一区二区三区在线观看| 久久午夜电影网| 一本大道久久a久久综合婷婷| 亚洲精品一区二区三区av| 欧美三区美女| 久久久99国产精品免费| 久久久www成人免费毛片麻豆| 亚洲高清精品中出| 亚洲精品久久7777| 国产精品视频福利| 米奇777超碰欧美日韩亚洲| 欧美承认网站| 欧美与欧洲交xxxx免费观看 | 午夜激情综合网| 欧美在线观看视频一区二区三区| 影院欧美亚洲| 日韩一级黄色av| 一区二区在线视频| 亚洲精品久久嫩草网站秘色| 国产精品亚发布| 亚洲国产精品久久久久婷婷老年 | 国产在线高清精品| 亚洲黄色在线| 国产日韩欧美电影在线观看| 亚洲国产精品一区二区www| 国产精品久久久久久久app| 免费日韩成人| 国产亚洲a∨片在线观看| 亚洲人成毛片在线播放| 国产综合视频在线观看| 日韩亚洲视频| 91久久国产自产拍夜夜嗨| 亚洲综合国产| 一区二区欧美在线| 美国三级日本三级久久99| 欧美在线精品免播放器视频| 欧美精品在线极品| 美女爽到呻吟久久久久| 国产精品蜜臀在线观看| 亚洲黄色成人网| 在线看片第一页欧美| 午夜精品久久久久久99热软件 | 国产欧美日韩在线视频| 亚洲精品美女免费| 91久久精品日日躁夜夜躁欧美| 香蕉久久夜色精品| 亚洲欧美日韩天堂一区二区| 欧美精品激情在线| 亚洲黄色大片| 日韩视频一区二区三区在线播放| 久久久五月天| 久久亚洲精品一区二区| 国产视频在线观看一区二区三区| 一区二区三区四区五区在线 | 国产精品日韩久久久| 日韩午夜电影在线观看| 一区二区电影免费在线观看| 欧美国产日韩一二三区| 欧美激情一区二区三区| 1024成人| 欧美成人自拍| 亚洲人午夜精品| 宅男精品导航| 欧美午夜一区二区三区免费大片| 99精品国产99久久久久久福利| 一区二区精品在线观看| 国产精品成人一区二区网站软件| 一区二区三区精品国产| 亚洲一区二区四区| 国产精品女人网站| 午夜国产精品影院在线观看| 久久国产精品久久国产精品 | 欧美精品黄色| 亚洲视频在线一区观看| 欧美在线播放一区| 一区免费视频| 欧美精品黄色| 亚洲综合首页| 欧美成人黑人xx视频免费观看| 亚洲高清av| 欧美日韩亚洲高清| 亚洲欧美国产va在线影院| 久久女同互慰一区二区三区| 亚洲国产美女精品久久久久∴| 欧美精品在线一区二区| 亚洲一区二区免费看| 久久久噜噜噜久久| 亚洲激情成人网| 国产精品久久久久久久久久三级| 欧美制服丝袜| 亚洲欧洲午夜| 久久久久久久欧美精品| 亚洲美女免费视频| 国产区亚洲区欧美区| 免费在线播放第一区高清av| 亚洲一区亚洲二区| 欧美国产视频在线观看| 亚洲影院免费| 亚洲第一精品夜夜躁人人躁| 国产精品扒开腿做爽爽爽软件| 久久福利影视| av成人免费在线| 欧美jizzhd精品欧美巨大免费| 亚洲桃色在线一区| 在线精品高清中文字幕| 国产精品豆花视频| 欧美成人精品影院| 欧美一区二区精品久久911| 亚洲精品久久嫩草网站秘色| 久久漫画官网| 欧美专区日韩视频| 99天天综合性| 91久久精品国产91性色| 国产日韩专区在线| 国产精品红桃| 欧美日韩国产成人| 久久婷婷成人综合色| 亚洲免费伊人电影在线观看av| 亚洲黄色天堂| 美女黄网久久| 久久天天躁狠狠躁夜夜爽蜜月| 这里只有精品视频| 99re8这里有精品热视频免费| 狠狠入ady亚洲精品经典电影| 国产精品夜夜夜| 欧美日韩一区自拍| 欧美精品性视频| 欧美不卡一卡二卡免费版| 久久久久久国产精品一区| 亚洲欧美视频在线观看视频| 一级成人国产| 一区二区三区成人| 亚洲精品久久久一区二区三区| 欧美激情一区二区| 欧美国产91| 亚洲第一区中文99精品| 欧美成人亚洲成人| 免费日韩av片| 亚洲第一主播视频| 欧美成人高清| 亚洲国产婷婷香蕉久久久久久99 | 久久亚洲影音av资源网| 久久精品国产久精国产爱| 亚洲免费一区二区| 亚洲欧美另类综合偷拍| 亚洲欧美成人网| 午夜视频一区在线观看| 欧美亚洲专区| 久久久久久9| 久久综合久久久| 欧美国产欧美综合| 亚洲国产高清在线| 亚洲国语精品自产拍在线观看| 亚洲片在线观看| 在线综合+亚洲+欧美中文字幕| 亚洲一区二区三区在线| 香蕉成人久久| 免费不卡亚洲欧美| 欧美女同在线视频| 国产精品草莓在线免费观看| 国产欧美一区二区精品仙草咪| 国产视频在线观看一区二区三区| 国产在线国偷精品产拍免费yy| 黄色另类av| 一本大道久久a久久综合婷婷| 亚洲欧美日韩区| 久久综合九色99| 亚洲日本激情| 亚洲综合色视频| 欧美成人蜜桃| 国产精品日本| 亚洲欧洲三级电影| 亚洲制服av| 欧美a级片网| 宅男精品视频| 久久综合狠狠| 欧美日韩一区在线观看视频| 国产一区二区三区直播精品电影 | 日韩一二三区视频| 欧美一区二区在线免费观看| 欧美成人免费全部| 99国产成+人+综合+亚洲欧美| 欧美一区二区三区视频在线观看| 免费在线观看一区二区| 国产视频观看一区| aa级大片欧美| 牛人盗摄一区二区三区视频| 夜夜嗨av一区二区三区网页| 狂野欧美激情性xxxx| 国产精品视频精品| 亚洲精品网站在线播放gif| 性欧美1819性猛交| 亚洲日本视频|