亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
樓主: flyeon
打印 上一主題 下一主題

[C++] 關(guān)于c++ [復(fù)制鏈接]

論壇徽章:
0
31 [報(bào)告]
發(fā)表于 2007-05-31 20:05 |只看該作者
原帖由 antigloss 于 2007-5-31 19:46 發(fā)表

C++ 不僅僅是面向?qū)ο蟮恼Z(yǔ)言。


對(duì)
不過(guò)它的出現(xiàn)應(yīng)該主要是為了體現(xiàn)面向?qū)ο蟮乃枷?/td>

論壇徽章:
0
32 [報(bào)告]
發(fā)表于 2007-05-31 20:07 |只看該作者
原帖由 ypxing 于 2007-5-31 20:05 發(fā)表


對(duì)
不過(guò)它的出現(xiàn)應(yīng)該主要是為了體現(xiàn)面向?qū)ο蟮乃枷?

設(shè)計(jì)之初的確如此,所以那時(shí)叫做 C with class

論壇徽章:
0
33 [報(bào)告]
發(fā)表于 2007-06-01 00:27 |只看該作者
原帖由 zhujiang73 于 2007-5-31 14:35 發(fā)表


java 不能支持多語(yǔ)言這一點(diǎn)不如 .net  。如果 Linux 上的 .net 兼容環(huán)境(如 Mono 等)好用,我現(xiàn)在就換成 C# ,可是 Mono 成熟了嗎,沒(méi)有。所以我現(xiàn)在主要用 C++ ,用 C++  編程比用 C  編程還是要簡(jiǎn)單一些。



支持多語(yǔ)言,只是ms把世界上的vb程序員(曾經(jīng)世界上最多的程序員)繼續(xù)抓在手上的一個(gè)手段而已。每個(gè)語(yǔ)言都有自己的特點(diǎn),如果需要(比如共用以前的開源資源),我寧可從新開始學(xué)這個(gè)語(yǔ)言,這樣子才純粹。

c++編程比c難很多,你覺得比c簡(jiǎn)單可能是把c++當(dāng)成c的過(guò)程來(lái)使,然后有個(gè)stl就覺得簡(jiǎn)單了而已,其實(shí)這樣子應(yīng)該算c++的門都沒(méi)進(jìn)


c只要學(xué)通了 c程序設(shè)計(jì)和c專家編程,基本就能把程序?qū)懙暮芎?/td>

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
34 [報(bào)告]
發(fā)表于 2007-06-01 00:33 |只看該作者
原帖由 benlan 于 2007-6-1 00:27 發(fā)表
c只要學(xué)通了 c程序設(shè)計(jì)和c專家編程,基本就能把程序?qū)懙暮芎?/blockquote>

編程要是這么簡(jiǎn)單就好嘍

[ 本帖最后由 MMMIX 于 2007-6-1 10:58 編輯 ]

論壇徽章:
0
35 [報(bào)告]
發(fā)表于 2007-06-01 10:52 |只看該作者
  同意MMMIX的說(shuō)法,c要是真這么簡(jiǎn)單就好了,有時(shí)候越是貌似簡(jiǎn)單的東西越復(fù)雜,用得越久就越覺得自己懂得東西太少。當(dāng)然,c++引入了很多新的概念,同樣也不簡(jiǎn)單,但并不能因此就認(rèn)為其它語(yǔ)言就簡(jiǎn)單。
  我用過(guò)c和java,對(duì)c++基本不了解,其實(shí)我對(duì)java也不怎么了解,因?yàn)楣ぷ餍枰褂胘ava,好長(zhǎng)一段時(shí)間后和同事聊天才發(fā)現(xiàn)自己壓根就是亂用java,因?yàn)槲沂怯妹嫦蜻^(guò)程的方法來(lái)寫java程序。當(dāng)然,程序依然能正確執(zhí)行,但卻違背了語(yǔ)言本身的最大初衷。
  做技術(shù)久了,對(duì)語(yǔ)言的認(rèn)識(shí)也在加深,其實(shí)每種語(yǔ)言都有自己特定的使用環(huán)境,都有他們的缺點(diǎn)和優(yōu)點(diǎn),所以不能對(duì)一種語(yǔ)言簡(jiǎn)單的就蓋棺定論。語(yǔ)言都有相似性,一門語(yǔ)言精通了,其它的也能觸類旁通,入門相對(duì)就比較簡(jiǎn)單,但要達(dá)到精通的地步還是需要時(shí)日的。
  本人不大贊同拿c和c++語(yǔ)言進(jìn)行比較,因?yàn)楸容^兩個(gè)層次的東西本身立足點(diǎn)就不對(duì)。此外,過(guò)于專注于語(yǔ)言本身,我認(rèn)為是有些本末倒置了,語(yǔ)言只是我們技術(shù)人員與計(jì)算機(jī)操作系統(tǒng)打交道的工具,計(jì)算機(jī)的基礎(chǔ)理論知識(shí)才是關(guān)鍵和核心。

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
36 [報(bào)告]
發(fā)表于 2007-06-01 10:59 |只看該作者
原帖由 Sorehead 于 2007-6-1 10:52 發(fā)表
  同意MMMIX的說(shuō)法,c要是真這么簡(jiǎn)單就好了,

呃……其實(shí)我是想說(shuō)“編程要是這么簡(jiǎn)單就好了”

論壇徽章:
24
獅子座
日期:2013-12-31 10:48:0015-16賽季CBA聯(lián)賽之吉林
日期:2016-04-18 14:43:1015-16賽季CBA聯(lián)賽之北控
日期:2016-05-18 15:01:4415-16賽季CBA聯(lián)賽之上海
日期:2016-06-22 18:00:1315-16賽季CBA聯(lián)賽之八一
日期:2016-06-25 11:02:2215-16賽季CBA聯(lián)賽之佛山
日期:2016-08-17 22:48:2615-16賽季CBA聯(lián)賽之福建
日期:2016-12-27 22:39:272016科比退役紀(jì)念章
日期:2017-02-08 23:49:4315-16賽季CBA聯(lián)賽之八一
日期:2017-02-16 01:05:3415-16賽季CBA聯(lián)賽之山東
日期:2017-02-22 15:34:5615-16賽季CBA聯(lián)賽之上海
日期:2017-11-25 16:17:5015-16賽季CBA聯(lián)賽之四川
日期:2016-01-17 18:38:37
37 [報(bào)告]
發(fā)表于 2007-06-01 13:34 |只看該作者

回復(fù) 33樓 benlan 的帖子

支持多語(yǔ)言,只是ms把世界上的vb程序員(曾經(jīng)世界上最多的程序員)繼續(xù)抓在手上的一個(gè)手段而已。每個(gè)語(yǔ)言都有自己的特點(diǎn),如果需要(比如共用以前的開源資源),我寧可從新開始學(xué)這個(gè)語(yǔ)言,這樣子才純粹。

c++編程比c難很多,你覺得比c簡(jiǎn)單可能是把c++當(dāng)成c的過(guò)程來(lái)使,然后有個(gè)stl就覺得簡(jiǎn)單了而已,其實(shí)這樣子應(yīng)該算c++的門都沒(méi)進(jìn)


c只要學(xué)通了 c程序設(shè)計(jì)和c專家編程,基本就能把程序?qū)懙暮芎?/blockquote>


每個(gè)語(yǔ)言都有自己的特點(diǎn),但應(yīng)該可以為其它語(yǔ)言提供一個(gè)簡(jiǎn)單統(tǒng)一的接口,這樣用一種語(yǔ)言寫的庫(kù)模塊就可以用其它的語(yǔ)言調(diào)用,語(yǔ)言的特色應(yīng)該體現(xiàn)在模塊內(nèi)部,不應(yīng)該體現(xiàn)在模塊接口上。與你合作的程序員只需要了解接口就可以調(diào)用你寫的模塊,他不用關(guān)心你的模塊是用什么語(yǔ)言寫的?纯  gtk 的相關(guān)開發(fā)人員為了讓 gtk 支持多種語(yǔ)言寫了多少包裝代碼,你就知道直接支持多語(yǔ)言的系統(tǒng)是多可愛了。

C++  內(nèi)置的面向?qū)ο,模板等功能的卻可以讓編程容易很多。關(guān)于我 C++  入沒(méi)入門,請(qǐng)看我的大作:(趁機(jī)炒作 一下 ) “C++ 簡(jiǎn)單遠(yuǎn)程調(diào)用中間件設(shè)計(jì)”  
http://blog.chinaunix.net/u/21585/showart_290864.html

[ 本帖最后由 zhujiang73 于 2007-6-1 14:53 編輯 ]

論壇徽章:
0
38 [報(bào)告]
發(fā)表于 2007-06-01 22:59 |只看該作者
原帖由 zhujiang73 于 2007-6-1 13:34 發(fā)表


每個(gè)語(yǔ)言都有自己的特點(diǎn),但應(yīng)該可以為其它語(yǔ)言提供一個(gè)簡(jiǎn)單統(tǒng)一的接口,這樣用一種語(yǔ)言寫的庫(kù)模塊就可以用其它的語(yǔ)言調(diào)用,語(yǔ)言的特色應(yīng)該體現(xiàn)在模塊內(nèi)部,不應(yīng)該體現(xiàn)在模塊接口上。與你合作的程序員只需要了 ...



看了下大作,先敬仰一下,這樣的東東我寫不出來(lái),樓上強(qiáng)人。

不過(guò)只有幾個(gè).h文件,看不出實(shí)質(zhì)的東西,用了繼承,模板和運(yùn)算符重載,stl等,看不到實(shí)現(xiàn),不清楚里面的實(shí)現(xiàn)是c++過(guò)程的還是對(duì)象的,要不就到cu把大作open一下,讓大家也學(xué)習(xí)。

論壇徽章:
24
獅子座
日期:2013-12-31 10:48:0015-16賽季CBA聯(lián)賽之吉林
日期:2016-04-18 14:43:1015-16賽季CBA聯(lián)賽之北控
日期:2016-05-18 15:01:4415-16賽季CBA聯(lián)賽之上海
日期:2016-06-22 18:00:1315-16賽季CBA聯(lián)賽之八一
日期:2016-06-25 11:02:2215-16賽季CBA聯(lián)賽之佛山
日期:2016-08-17 22:48:2615-16賽季CBA聯(lián)賽之福建
日期:2016-12-27 22:39:272016科比退役紀(jì)念章
日期:2017-02-08 23:49:4315-16賽季CBA聯(lián)賽之八一
日期:2017-02-16 01:05:3415-16賽季CBA聯(lián)賽之山東
日期:2017-02-22 15:34:5615-16賽季CBA聯(lián)賽之上海
日期:2017-11-25 16:17:5015-16賽季CBA聯(lián)賽之四川
日期:2016-01-17 18:38:37
39 [報(bào)告]
發(fā)表于 2007-06-01 23:31 |只看該作者

回復(fù) 38樓 benlan 的帖子

原帖由 benlan 于 2007-6-1 22:59 發(fā)表
看了下大作,先敬仰一下,這樣的東東我寫不出來(lái),樓上強(qiáng)人。

不過(guò)只有幾個(gè).h文件,看不出實(shí)質(zhì)的東西,用了繼承,模板和運(yùn)算符重載,stl等,看不到實(shí)現(xiàn),不清楚里面的實(shí)現(xiàn)是c++過(guò)程的還是對(duì)象的,要不就到 ...


blog 文章附件中的 *.cc 文件就是實(shí)現(xiàn), 包括庫(kù)和例子程序, 本來(lái)就是 open 的。

論壇徽章:
24
獅子座
日期:2013-12-31 10:48:0015-16賽季CBA聯(lián)賽之吉林
日期:2016-04-18 14:43:1015-16賽季CBA聯(lián)賽之北控
日期:2016-05-18 15:01:4415-16賽季CBA聯(lián)賽之上海
日期:2016-06-22 18:00:1315-16賽季CBA聯(lián)賽之八一
日期:2016-06-25 11:02:2215-16賽季CBA聯(lián)賽之佛山
日期:2016-08-17 22:48:2615-16賽季CBA聯(lián)賽之福建
日期:2016-12-27 22:39:272016科比退役紀(jì)念章
日期:2017-02-08 23:49:4315-16賽季CBA聯(lián)賽之八一
日期:2017-02-16 01:05:3415-16賽季CBA聯(lián)賽之山東
日期:2017-02-22 15:34:5615-16賽季CBA聯(lián)賽之上海
日期:2017-11-25 16:17:5015-16賽季CBA聯(lián)賽之四川
日期:2016-01-17 18:38:37
40 [報(bào)告]
發(fā)表于 2007-06-04 11:22 |只看該作者

轉(zhuǎn)貼一篇文章,展示一下 C++ 的幾個(gè)重要特性,看懂這個(gè) C++ 就算基本懂了。

大家可以試試用 C  實(shí)現(xiàn)類似的功能,對(duì)大師應(yīng)該不是問(wèn)題,但是對(duì)像我這樣功力不足的,還是  C++  好用一些。

http://www.stlchina.org/twiki/bin/view.pl/Main/BoostSource_any

Boost源碼剖析之:泛型指針類any之海納百川
作者:ppLiu(劉未鵬)

C++是強(qiáng)類型語(yǔ)言,所有強(qiáng)類型語(yǔ)言對(duì)型別的要求都是苛刻的,型別一有不合編譯器就會(huì)抱怨說(shuō)不能將某某型別轉(zhuǎn)換為某某型別,當(dāng)然如果在型別之間提供了轉(zhuǎn)換操作符或是標(biāo)準(zhǔn)所允許的一定程度的隱式轉(zhuǎn)換(如經(jīng)過(guò)非explicit構(gòu)造函數(shù)創(chuàng)建臨時(shí)變量的隱式轉(zhuǎn)換或是在int,long這些基本型別間的)又另當(dāng)別論?偟恼f(shuō)來(lái),為了保持型別安全,C++有嚴(yán)厲的要求。然而有時(shí)候程序員可能有這樣的需要:

int i;
iong j;
X x; //假設(shè)X為用戶定義的類
any anyVal=i;
... //use anyVal as a int value
anyVal=j;
... //use anyVal as a long value
anyVal=x;
... //use anyVal as a long value

考慮這樣的一個(gè)“泛型指針類”該如何設(shè)計(jì)是很有趣的事情。

1.它本身不能是模板類,因?yàn)槿绻悄0,你必須為它的具現(xiàn)化提供模板參數(shù)。而事實(shí)上你并不想這樣做。你想讓同一個(gè)對(duì)象接受任意型別的數(shù)據(jù)。在上面的代碼中這個(gè)對(duì)象是anyVal。然而,如果你必須為它提供模板參數(shù),那么上面的代碼看起來(lái)就會(huì)像這樣:

any<int> anyIntVal=i;
any<long> anyLongVal=j;
...

這顯然已經(jīng)喪失了anyVal的優(yōu)勢(shì)----以單個(gè)對(duì)象接受所有型別的數(shù)據(jù)。與其這樣還不如直接寫:

int anyIntVal=i;
int anyLongVal=j;

所以,any不能是模板類。

2.它必須提供某些有關(guān)它所保存的對(duì)象型別的信息。

3. 它必須提供某種方法將它保存的數(shù)值“取出來(lái)”。

事實(shí)上,Boost庫(kù)已經(jīng)提供了這樣的類boost::any,下面我就為你講述它的原理及構(gòu)造。

首先,any類里面一定要提供一個(gè)模板構(gòu)造函數(shù)和模板operator=操作符。因?yàn)槟惚仨氃试S用戶寫出:

any any_value(val); //val 的型別為任意的
any_value=val1; //val1 型別也是任意的

這樣的代碼。

其次,數(shù)據(jù)的存放之所是個(gè)問(wèn)題,顯然你不能將它保存在any類中,那會(huì)導(dǎo)致any類成為模板類,后者是明確不被允許的。數(shù)據(jù)應(yīng)該動(dòng)態(tài)存放,即動(dòng)態(tài)分配一個(gè)數(shù)據(jù)的容器來(lái)存放數(shù)據(jù),而any類中則保存指向這個(gè)容器的指針,明確地說(shuō),是指向這個(gè)容器的基類的指針,這是因?yàn)槿萜鞅旧肀仨殲槟0,而any類中的指針成員又必須不是泛型的(因?yàn)閍ny不能是泛型的,所以any中所有數(shù)據(jù)成員都不能是泛型的),所以,結(jié)論是:為容器準(zhǔn)備一個(gè)非泛型的基類,而讓指針指向該基類。

下面就看一看boost庫(kù)是如何具體實(shí)現(xiàn)這兩點(diǎn)的。

//摘自”boost/any.hpp”
class any
{
        public:
        class placeholder    //泛型數(shù)據(jù)容器holder的非泛型基類   
        {                    
                public: // structors
                virtual ~placeholder() //虛析構(gòu)函數(shù),為保證派生類對(duì)象能用基類指針析構(gòu)
                {}
                public: // queries
                virtual const std::type_info & type() const = 0; //提供關(guān)于型別的信息
                virtual placeholder * clone() const = 0;  //復(fù)制容器
        };
        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);  //typeid返回std::typeinfo對(duì)象引用,后者包含任意
                        //對(duì)象的型別信息如name,還提供operator==操作符
                        //你可以用typeid(oneObj)==typeid(anotherObj)來(lái)比
                        //兩個(gè)對(duì)象之型別是否一致
                }
                virtual placeholder * clone() const
                {
                        return new holder(held);  //改寫虛函數(shù),返回自身的復(fù)制體
                }
                public: // representation
                ValueType held;  //數(shù)據(jù)保存的地方
        };//類定義結(jié)束
        
        placeholder * content;   //指向泛型數(shù)據(jù)容器holder的基類placeholder的指針
        template<typename ValueType>
        any(const ValueType & value)
        : content(new holder<ValueType>(value)) //模板構(gòu)造函數(shù),動(dòng)態(tài)分配數(shù)據(jù)容器并調(diào)用其構(gòu)
        //造函數(shù)
        {}
        ...
        template<typename ValueType>
        any & operator=(const ValueType & rhs)    //與模板構(gòu)造函數(shù)一樣,但使用了swap慣用手法
        {
                any(rhs).swap(*this); //先創(chuàng)建一個(gè)臨時(shí)對(duì)象any(rhs),再調(diào)用下面的swap函數(shù)進(jìn)行底層
                //數(shù)據(jù)交換,注意與*this交換數(shù)據(jù)的是臨時(shí)對(duì)象,所以rhs的底層
                //數(shù)據(jù)并未被更改,只是在swap結(jié)束后臨時(shí)對(duì)象擁有了*this的底
                //層數(shù)據(jù),而此時(shí)*this也擁有了臨時(shí)對(duì)象構(gòu)造時(shí)所擁有的rhs的數(shù)
                //據(jù)的副本。然后臨時(shí)對(duì)象由于生命期的結(jié)束而被自動(dòng)析構(gòu),*this
                //原來(lái)的底層數(shù)據(jù)隨之煙消云散。
                return *this;
        }
        any & swap(any & rhs)   //swap函數(shù),交換底層數(shù)據(jù)
        {
                std::swap(content, rhs.content); //只是簡(jiǎn)單地將兩個(gè)指針的值互換
                return *this;
        }
        ~any()  //析構(gòu)函數(shù)
        {
                delete content; //釋放容器,用的是基類指針,這就是placeholder需要一個(gè)虛
                //析構(gòu)函數(shù)的原因
        }
        ...
};

這雖然并非any的全部源代碼,但是所有重要的思想已經(jīng)表露無(wú)遺。剩下的部分只是一些簡(jiǎn)單的細(xì)節(jié),請(qǐng)參見boost庫(kù)的原文件。

“但是等等!”,你急切的說(shuō):“你失去了型別的信息!边...的確,當(dāng)賦值的模板函數(shù)返回后你也就失去了關(guān)于型別的信息?紤]下面你可能想要寫出的代碼:

int i=10;
boost::any anyVal=i;
int j=anyVal; //error,實(shí)際上你是想把a(bǔ)nyVal賦給另一個(gè)int型變量,這應(yīng)該以某種方式被允
//許,但決不是在any類中提供轉(zhuǎn)換操作符,因?yàn)槟闶孪炔⒉恢酪胊nyVal來(lái)承
//載何種型別的變量,所以轉(zhuǎn)換操作符無(wú)從給出。

當(dāng)轉(zhuǎn)換操作符的設(shè)想徹底失敗后,我們只能借助于某些“外來(lái)”的顯式轉(zhuǎn)換操作。就向static_cast<>一樣。Boost提供了any_cast<>,于是你可以這樣寫:

int j=any_cast<int>(anyVal);

事實(shí)上,any_cast的代碼是這樣的:

template<typename ValueType>
ValueType any_cast(const any & operand)
{
        const ValueType * result = any_cast<ValueType>(&operand);//調(diào)用any_cast針對(duì)指針的版
        //本。
        if(!result)  //如果cast失敗,即實(shí)際 保存的并非ValueType型數(shù)據(jù),則拋出一個(gè)異常
        throw bad_any_cast(); //派生自std::bad_cast
        return *result;
}

而any_cast針對(duì)指針的版本是這樣:

template<typename ValueType>
ValueType * any_cast(any * operand)
{
        return operand && operand->type() == typeid(ValueType) //這個(gè)型別檢查很重要,后面會(huì)
        //對(duì)它作更詳細(xì)的解釋
        1    ? &static_cast<any::holder<ValueType> *>(operand->content)->held:0; //這兒有個(gè)向下
        //型別轉(zhuǎn)換
}

這兩個(gè)any_cast版本應(yīng)該很好理解。后版本中的型別檢查是必要的,如果沒(méi)有這個(gè)檢查,考慮以下代碼:

int i=10;
boost::any anyVal=i;
double d=any_cast<double>(anyVal); //如果沒(méi)有那個(gè)型別檢查,這將通過(guò)編譯且運(yùn)行期通常也不
//會(huì)出錯(cuò),但是
//對(duì)d的賦值將會(huì)是非常奇怪的情形。

這將通過(guò)編譯,且運(yùn)行期通常竟然也不會(huì)出錯(cuò),下面我為你解釋為什么會(huì)這樣。

boost::anyVal=i;其實(shí)將anyVal.content指針指向了一個(gè)holder對(duì)象(請(qǐng)回顧上面的代碼)。然后any_cast(anyVal)實(shí)際上調(diào)用了any_cast<>針對(duì)指針的重載版本,并將anyVal的地址傳遞過(guò)去,也就是轉(zhuǎn)到1處,因?yàn)檎{(diào)用的是any_cast,所以1處的代碼被編譯器特化為

2  static_cast<any::holder<double> *>(operand->content)->held

但是前面說(shuō)過(guò),operand->content實(shí)際指向的是any::holder,所以這個(gè)static_cast<>是“非法”的,然而事實(shí)是:它能通過(guò)編譯!原因很簡(jiǎn)單,holder和holder都是placeholder的基類。將基類指針向派生類指針轉(zhuǎn)換被認(rèn)為是合法的。但這卻釀成大錯(cuò),因?yàn)楸磉_(dá)式2的型別將因此被推導(dǎo)為double!原先holder只給int held;成員分配了sizeof(int)個(gè)字節(jié)的內(nèi)存,而現(xiàn)在卻要將int型的held當(dāng)作double型來(lái)使用,也就是說(shuō)使用sizeof(double)個(gè)字節(jié)內(nèi)存。所以這就相當(dāng)于:

int i=10;
double* pd=(double*)(void*)&i;
double d=*pd; //行為未定義,但通常卻不會(huì)出錯(cuò),然而隱藏的錯(cuò)誤更可怕,你得到的d的值幾
//乎肯定不是你想要的。

使用typeinfo讓我們有可能在運(yùn)行時(shí)發(fā)現(xiàn)這種型別不符并及時(shí)拋出異常。但有個(gè)違反直觀的事情是上面的那行錯(cuò)誤的代碼仍能通過(guò)編譯,并且你也無(wú)法阻止它通過(guò)編譯,因?yàn)閔older和holder都是placeholder的基類。所以只能期望程序員們清楚自己在做什么,要不然就給他個(gè)異常瞧瞧。

使用boost::any實(shí)現(xiàn)virtual template成員函數(shù)

如你所知,C++中沒(méi)有提供virtual template function。然而有時(shí)候你的確會(huì)有這種需要,any可以一定程度上滿足這種需要,例如,

class Base
{
        public:
        virtual void Accept(boost::any anyData)
        {
                ...
        }
};
class Derived:public Base
{public:
        virtual void Accept(boost::any anyData)
        {
                ...
        }
};

這樣的Accept函數(shù)能夠接受任意類型的數(shù)據(jù),并且是virtual函數(shù)
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP