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

alex

alex

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  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變量。但感覺還是比較新穎的,-_-''也許我是菜鳥的原因,在腦袋轉了一下后,我實現了自己的一個類,用來接受任何參數,起初我認為any應該是個typedef,而接收的類型也是前面知道的(-_-''又沒弄清需求就去實現了),所以實現一個接收任何參數的類需要個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;

這樣似乎就可以接收任何類型了,也可以取出數據,取出時必須要知道相應的類型,而且,假如類型不在列表里面,則編譯期出錯
class?CERROR_ACCESS_DENIED;
LOKI_STATIC_CHECK((Loki::TL::IndexOf<_typelist,_Ty>::value != -???? 1),CERROR_ACCESS_DENIED);
這樣,-_-''似乎就可以了,只要所接收的類型可以拷貝即可。但有個明了的缺陷,那1就是接收的類型必須編譯期寫死,假如不寫死的話,我個人開始的認為是加一個基類,-_-''
還是要3q我那位朋友,讓我了解到boost::any的用法
下面是boost::any的具體分析,我們要達到下面幾個要求:
1:可以接收任何類型的數據(具有value屬性)
2: 可以方便的取出數據
3:型別安全,不象void*
下面是boost::any的實現,我按部分貼,而且省去我認為不重要的東西,因為太長了,這會影響我blog的收視率。
1:首先來看下他的構造和稀構(-_-''錯別字)
?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;
?}
從構造函數可以看到,any可以接受默認的,任何其他值包括ant本身,在稀構里面可以看到對content的釋放,content在這里是一個基類的指針,是any內部實現的,我們可以看到,在對any構造是有種方法:
(1)content(new holder<ValueType>(value))
(2)content(other.content ? other.content->clone() : 0)
稍后會看到holder是派生自content類型的一個模板實現,也許講到這里,有些應該明白了any是怎么保存任何類型的吧,對于其他any的構造,我們發現調用了content的一個clone方法,很明顯這是content的一個虛方法,這個方法的存在得以讓我們運用虛函數的機制正確的拷貝對象,下面會看到這只是個簡單的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 =,接收任何其他類型的參數,swap方法的實現,用來交換2個對象的content指針,我們可以看到operator =里面臨時對象的構建,在函數結束后,自動釋放原來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調用的函數和虛基本必須的虛稀構函數(可以看到any對content調用了delete)
下面是holder的實現,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的,這樣就提供了對數據訪問的功能,在訪問的時候必須要知道具體要訪問的類型,才能調用相應的static_cast或者dynamic_cast來操作,而這樣其實也提供了型別安全的保證,eg:不象malloc,返回void*,然后()轉換一下。
5:看下怎么訪問any里面的屬性值:這里就不列舉出所有的實現,因為有些是對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些原來實現的代碼和注釋
可以看到具體的實現方式&dynamic_cast的邏輯差不多,對引用的cast有可能拋出異常。通過上面這種方式,就達到了對數據的讀取,讀取時必須知道里面的數據類型。可以看出any只能保存一個值,-_-''不向我那個,可以同時保存不同類型的值。
6:extension
可以通過std::vector<boost::any> anys,來構建一個任何類型的列表,但訪問比較麻煩。
也可以通過any來達到虛函數不能為template的限制(因為一個是靜態的一個是動態的)
象下面:
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 閱讀(438) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩亚洲精品电影| 欧美精品二区| 午夜久久久久久久久久一区二区| 1024亚洲| 亚洲色图在线视频| 你懂的国产精品| 亚洲美女淫视频| 欧美日韩日本视频| 另类成人小视频在线| 一个色综合av| 国产精品日韩精品欧美精品| 欧美风情在线| 亚洲高清色综合| 亚洲国产专区校园欧美| 欧美日韩一区国产| 久久黄色影院| 一区二区三区你懂的| 亚洲黄色在线视频| 亚洲精品少妇| 亚洲视频axxx| 久久精品国产清高在天天线| 国产精品一区久久| 久久久精品日韩| 欧美日本一道本| 欧美人妖在线观看| 亚洲精品久久久久久久久久久 | 久久综合五月| 久久综合色婷婷| 亚洲一区欧美一区| 亚洲国产精品久久久久婷婷老年 | 99精品国产在热久久婷婷| 免费成人在线观看视频| 亚洲成人直播| 久久这里只精品最新地址| 久久精品噜噜噜成人av农村| 久久免费高清| 欧美96在线丨欧| 你懂的视频欧美| 一区二区三区不卡视频在线观看 | 亚洲一区国产精品| 欧美一区二区三区四区视频| 蜜臀久久99精品久久久久久9| 国产精品一区二区三区观看 | 久久另类ts人妖一区二区| 欧美紧缚bdsm在线视频| 亚洲激情电影在线| 日韩亚洲不卡在线| 久久亚洲国产精品日日av夜夜| 亚洲免费观看高清在线观看| 欧美久久婷婷综合色| 久久人人爽人人| 亚洲看片一区| 亚洲男人第一网站| 久久久夜精品| 亚洲视频综合| 性视频1819p久久| 美女视频网站黄色亚洲| 久久麻豆一区二区| 国产亚洲欧洲一区高清在线观看 | 99视频国产精品免费观看| 可以免费看不卡的av网站| 欧美一区二区三区在线看 | 亚洲女人天堂成人av在线| 亚洲精品一区二区在线观看| 久久久久久久久一区二区| 欧美国产精品专区| 亚洲精华国产欧美| 亚洲一区二区视频在线观看| 美女视频黄免费的久久| 国产日韩欧美亚洲| 亚洲午夜精品久久久久久app| 国产一区二区三区在线观看视频| 亚洲一区二区三区免费视频| 亚洲日本理论电影| 国产精品国产三级国产a| 久久精品国产欧美激情| 国产精品成人一区二区三区吃奶| 99精品欧美一区| 久久精品人人| 欧美大成色www永久网站婷| 欧美福利小视频| 亚洲欧美国产三级| 亚洲激情视频网站| 久久婷婷成人综合色| 亚洲欧洲一区二区在线播放| 欧美在线亚洲在线| 久久美女艺术照精彩视频福利播放| 亚洲深夜福利| 国产亚洲人成a一在线v站| 麻豆精品国产91久久久久久| 久久精品三级| 一区二区三区自拍| 亚洲欧洲综合另类| 久久香蕉国产线看观看网| 国产精品分类| 欧美电影免费观看高清完整版| 久久久国产精品一区二区中文| 久久久久成人精品| 一区二区三区欧美成人| 国产精品美女久久福利网站| 久久久欧美精品| 欧美有码视频| 免费欧美日韩| 欧美日韩亚洲高清| 欧美国产日韩二区| 欧美aa国产视频| 麻豆视频一区二区| 欧美激情一区二区三区不卡| 亚洲丰满在线| 一区在线视频| 久久精品视频亚洲| 亚洲一区二区三区午夜| 99精品国产在热久久| 亚洲视频在线观看三级| 亚洲欧美日韩网| 国产日韩欧美日韩| 亚洲韩国一区二区三区| 日韩视频精品在线观看| 日韩亚洲欧美成人| 一区二区三区视频在线播放| 欧美中日韩免费视频| 亚洲午夜未删减在线观看| 亚洲婷婷在线| 欧美一区影院| 亚洲剧情一区二区| 蜜桃久久av一区| 激情视频一区二区| 久久影院午夜论| 亚洲精品久久久久中文字幕欢迎你| 欧美韩日高清| 亚洲看片免费| 欧美一区二区三区视频免费播放| 亚洲大胆人体视频| 久久综合久久久久88| 亚洲精品永久免费| 亚洲一二三区视频在线观看| 亚洲一区二区三区精品在线观看| 亚洲一区二区四区| 欧美日韩国产在线观看| 一区精品在线播放| 麻豆成人av| 久久精品一区二区三区不卡| 欧美另类专区| 亚洲欧美日韩国产综合精品二区 | 国产欧美精品va在线观看| 欧美在线免费观看| 久久久免费观看视频| 亚洲女ⅴideoshd黑人| 国内精品久久久久影院色 | 亚洲大片在线观看| 一区电影在线观看| 国产欧美一区二区三区沐欲| 在线综合视频| 亚洲无线一线二线三线区别av| 精品成人久久| 欧美福利一区二区| 99这里只有精品| 久久精品亚洲乱码伦伦中文| 欧美视频在线一区| 欧美 日韩 国产一区二区在线视频| 欧美一进一出视频| 午夜日韩视频| 噜噜噜91成人网| 亚洲天堂视频在线观看| 亚洲图片你懂的| 亚洲国产精品久久91精品| 亚洲免费一在线| aa成人免费视频| 欧美深夜影院| 欧美日韩不卡在线| 一区二区日韩伦理片| 欧美成人精品不卡视频在线观看 | 一本色道久久综合亚洲91| 欧美成人午夜| 国产精品久久久久久影院8一贰佰| 99re热这里只有精品视频| 在线观看成人小视频| 亚洲欧美制服另类日韩| 99热精品在线| 欧美日韩国产欧| 美女网站在线免费欧美精品| 欧美在线观看www| 欧美日韩亚洲一区二区三区在线观看| 亚洲国产精品久久91精品| 在线观看91精品国产入口| 亚洲午夜高清视频| 久久久久9999亚洲精品| 亚洲深夜福利| 亚洲欧美在线aaa| 麻豆精品国产91久久久久久| 亚洲国产精品成人精品| 欧美午夜精品久久久久免费视 | 亚洲一区二三| 国产一区成人| 欧美激情91| 午夜日韩av| 99精品国产热久久91蜜凸| 久久精品电影| 亚洲美女在线视频| 国产欧美一区二区在线观看|