• <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>

            alex

            alex

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              7 隨筆 :: 6 文章 :: 7 評論 :: 0 Trackbacks

            前幾天一個朋友給我看了1段代碼:
            any temp; //any is a class
            temp = 1;
            temp = "a";
            temp = x; //x is a abstract class

            看到這段代碼著實下了1跳.初期的感覺象void*指針那樣,又象variant變量。但感覺還是比較新穎的,-_-''也許我是菜鳥的原因,在腦袋轉(zhuǎn)了一下后,我實現(xiàn)了自己的一個類,用來接受任何參數(shù),起初我認為any應(yīng)該是個typedef,而接收的類型也是前面知道的(-_-''又沒弄清需求就去實現(xiàn)了),所以實現(xiàn)一個接收任何參數(shù)的類需要個typelist,和對每種類型的泛化,下面是class的定義:

            template<typename _typelist>
            class?any
            {
            public:
            ?typedef typename Loki::TL::TypeAtNonStrict<_typelist,0>::Result?param1;
            ?typedef typename Loki::TL::TypeAtNonStrict<_typelist,1>::Result?param2;
            ?typedef typename Loki::TL::TypeAtNonStrict<_typelist,2>::Result?param3;
            ?typedef typename Loki::TL::TypeAtNonStrict<_typelist,3>::Result?param4;
            ?typedef typename Loki::TL::TypeAtNonStrict<_typelist,4>::Result?param5;

            ?any(param1 param):
            ??m_param1(param){}

            ?any(param2 param):
            ??m_param2(param){}

            ?any(param3 param):
            ??m_param3(param){}

            ?any(param4 param):
            ??m_param4(param){}

            ?template<typename _Ty>
            ?const _Ty&??Get()
            ?{
            ???? class?CERROR_ACCESS_DENIED;
            ???? LOKI_STATIC_CHECK((Loki::TL::IndexOf<_typelist,_Ty>::value != -???? 1),CERROR_ACCESS_DENIED);

            ???? return?__Access<_Ty>();
            ?}
            private:
            ?template<typename _Ty>
            ?_Ty&? __Access();

            ?template<>
            ?param1& __Access<param1>() {return m_param1;}

            ?template<>
            ?param2& __Access<param2>() {return m_param2;}

            ?template<>
            ?param3& __Access<param3>() {return m_param3;}

            ?template<>
            ?param4& __Access<param4>() {return m_param4;}

            ?param1??m_param1;
            ?param2??m_param2;
            ?param3??m_param3;
            ?param4??m_param4;
            };

            typedef any<Loki::TYPE_LIST_3(int,float,char)>?ANY;

            這樣似乎就可以接收任何類型了,也可以取出數(shù)據(jù),取出時必須要知道相應(yīng)的類型,而且,假如類型不在列表里面,則編譯期出錯
            class?CERROR_ACCESS_DENIED;
            LOKI_STATIC_CHECK((Loki::TL::IndexOf<_typelist,_Ty>::value != -???? 1),CERROR_ACCESS_DENIED);
            這樣,-_-''似乎就可以了,只要所接收的類型可以拷貝即可。但有個明了的缺陷,那1就是接收的類型必須編譯期寫死,假如不寫死的話,我個人開始的認為是加一個基類,-_-''
            還是要3q我那位朋友,讓我了解到boost::any的用法
            下面是boost::any的具體分析,我們要達到下面幾個要求:
            1:可以接收任何類型的數(shù)據(jù)(具有value屬性)
            2: 可以方便的取出數(shù)據(jù)
            3:型別安全,不象void*
            下面是boost::any的實現(xiàn),我按部分貼,而且省去我認為不重要的東西,因為太長了,這會影響我blog的收視率。
            1:首先來看下他的構(gòu)造和稀構(gòu)(-_-''錯別字)
            ?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;
            ?}
            從構(gòu)造函數(shù)可以看到,any可以接受默認的,任何其他值包括ant本身,在稀構(gòu)里面可以看到對content的釋放,content在這里是一個基類的指針,是any內(nèi)部實現(xiàn)的,我們可以看到,在對any構(gòu)造是有種方法:
            (1)content(new holder<ValueType>(value))
            (2)content(other.content ? other.content->clone() : 0)
            稍后會看到holder是派生自content類型的一個模板實現(xiàn),也許講到這里,有些應(yīng)該明白了any是怎么保存任何類型的吧,對于其他any的構(gòu)造,我們發(fā)現(xiàn)調(diào)用了content的一個clone方法,很明顯這是content的一個虛方法,這個方法的存在得以讓我們運用虛函數(shù)的機制正確的拷貝對象,下面會看到這只是個簡單的new操作。
            2:來看下any的operator =的重載
            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;
            }
            可以看到operator =,接收任何其他類型的參數(shù),swap方法的實現(xiàn),用來交換2個對象的content指針,我們可以看到operator =里面臨時對象的構(gòu)建,在函數(shù)結(jié)束后,自動釋放原來content的對象,這有點RAII味道。(http://blog.sina.com.cn/u/1019039487)獨家小菜。。
            3:下面來看下輔助類
            ?bool empty() const
            ?{
            ??????return !content;
            ?}
            ?
            ?const std::type_info & type() const
            ?{
            ??????return content ? content->type() : typeid(void);
            ?}
            可以看到。一個empty,一個type,很形象。
            4:下面來看下上面content所指的對象,以及any怎么保存任何類型,以及這種怎么保證型別安全
            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;
            };(-_-''格式矯正真是類啊)
            ?
            placeholder就是上面content指向的對象,可以看到他定義的一些提供給any調(diào)用的函數(shù)和虛基本必須的虛稀構(gòu)函數(shù)(可以看到any對content調(diào)用了delete)
            下面是holder的實現(xiàn),holder是一個模板,里面定義的
            ValueType held;
            很明星是any用來保存任何類型的,回顧下上面所說的any初始化content的2種方法
            (1)content(new holder<ValueType>(value))
            (2)content(other.content ? other.content->clone() : 0)
            從這個地方可以看到怎么初始化holder對象,并保存到content.注意到這里的held是public的,這樣就提供了對數(shù)據(jù)訪問的功能,在訪問的時候必須要知道具體要訪問的類型,才能調(diào)用相應(yīng)的static_cast或者dynamic_cast來操作,而這樣其實也提供了型別安全的保證,eg:不象malloc,返回void*,然后()轉(zhuǎn)換一下。
            5:看下怎么訪問any里面的屬性值:這里就不列舉出所有的實現(xiàn),因為有些是對const的版本。
            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>
            ValueType any_cast(const any & operand)
            {
            ?????typedef BOOST_DEDUCED_TYPENAME??????? remove_reference<ValueType>::type nonref;
            ?
            ???const nonref * result = any_cast<nonref>(&operand);
            ???if(!result)
            ??????????? boost::throw_exception(bad_any_cast());
            ????return *result;
            }//這里去掉1些原來實現(xiàn)的代碼和注釋
            可以看到具體的實現(xiàn)方式&dynamic_cast的邏輯差不多,對引用的cast有可能拋出異常。通過上面這種方式,就達到了對數(shù)據(jù)的讀取,讀取時必須知道里面的數(shù)據(jù)類型。可以看出any只能保存一個值,-_-''不向我那個,可以同時保存不同類型的值。
            6:extension
            可以通過std::vector<boost::any> anys,來構(gòu)建一個任何類型的列表,但訪問比較麻煩。
            也可以通過any來達到虛函數(shù)不能為template的限制(因為一個是靜態(tài)的一個是動態(tài)的)
            象下面:
            class CBase
            {
            ?public:
            ???? virtual void Set(boost::any) = 0;
            };
            ?
            class CHild:
            ???? public CBase
            {
            ?public:
            ???? virtual void Set(boost::any param)
            ???? {
            ????????? m_value = param;
            ???? }
            ?private:
            ???? boost::any? m_value;
            };
            ?
            CHild?test;
            CBase* ptr = &test;
            ptr->Set(1);
            ptr->Set('a');
            7.finish...總算完成了...-_-''要變唐僧了...
            ????????????????????????????????????????????????? alex. agerlis@163.com
            posted on 2007-02-11 15:54 agerlis 閱讀(424) 評論(0)  編輯 收藏 引用
            亚洲AV日韩精品久久久久久久| 精品久久久久中文字幕日本| 欧美色综合久久久久久| 亚洲国产精品一区二区三区久久| 久久久www免费人成精品| 久久久久亚洲av无码专区| 久久青青草原精品国产软件| 日韩AV无码久久一区二区 | A级毛片无码久久精品免费| 久久天天躁狠狠躁夜夜av浪潮 | 久久不射电影网| 国产三级观看久久| 久久综合九色综合网站| 品成人欧美大片久久国产欧美...| 久久亚洲国产精品123区| 久久国产精品无码一区二区三区| 久久久久亚洲av成人无码电影| 日韩人妻无码一区二区三区久久 | 青青草原1769久久免费播放| 久久99热这里只频精品6| 国产精品激情综合久久| 久久99久久99精品免视看动漫| 久久久久久免费视频| 九九热久久免费视频| 欧美一区二区精品久久| 热re99久久6国产精品免费| 久久综合亚洲色一区二区三区| 久久中文精品无码中文字幕| AA级片免费看视频久久| 国产精品18久久久久久vr | 久久午夜综合久久| 国产成人精品久久| 999久久久国产精品| 亚洲国产成人久久综合一| 2020久久精品国产免费| 久久w5ww成w人免费| 99国产欧美精品久久久蜜芽| 人妻无码久久一区二区三区免费 | 麻豆久久久9性大片| 欧美日韩精品久久久免费观看| 很黄很污的网站久久mimi色|