隱性型別轉換的突發奇想與失望

2021-08-23 11:42:25 字數 974 閱讀 2169

在c++中,如果為自定義型別(class)定義了型別轉換操作符或沒有explicit關鍵字修飾的單引數建構函式,在需要的時候,編譯器會自動執行隱式型別轉換。這是乙個常識。隱式型別轉換是否需要的規則定義於編譯器內部,難以窺見,但就我理解,「需要」的意思之一應該是,如果不進行隱式型別轉換就找不到相應的過載函式,進行了就能找到的話,編譯器理應進行隱式型別轉換。

那天我看「委託」這個模式的時候,突然突發奇想,想到了利用隱式型別轉換進行非常簡單優美的委託的c++實現,不由大喜。

通常的b類要承擔a類的委託,**是這麼寫,略去建構函式等:

class a

;class b

};

但是,如果b類要**a類的很多函式甚至全部公有函式,重複地寫形如f()的函式定義就非常累人。

我當時的想法是:

#include using namespace std;

class a

};class b

~b()

operatora() const

};int main()

理論上,編譯器應當發現b類並沒有成員函式a_func,並且發現如果執行隱式型別轉換就可以呼叫a類的a_func,從而進行隱式型別轉換。這樣,就實現了非常輕巧的「完全」委託,或曰一種不是繼承的繼承。當然,這純粹是一種hack,肯定不是在實際中應該推薦的**風格。

遺憾的是,gcc和vc 2005+對於上面這段程式甚至都無法通過編譯。這究竟是因為編譯器不夠smart,還是我對c++標準理解有誤,我不知道。只是可惜了,這個突發奇想來的時候,我真的欣喜若狂,覺得這樣的**可以發揚開來,進行一種元程式設計,從而實現類似於lua中元表那樣的概念來處理method not found這樣的情況。

可惜夠不著,要不我還真的希望c++標準中明確一下隱式型別轉換的規則,最好加上這個情況和一些更有趣的情況,呵呵~p.s.一句,熱切盼望c++0x中.....

突發奇想的strlen和sizeof的區別

一 sizeof sizeof 是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列 指標 型別 物件 函式等。它的功能是 獲得保證能容納實現所建立的最大物件的位元組大小。由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。實際...

愛突發奇想的我 合租,耳機,套套

週末一般都是睡覺睡到自然醒,今天醒來時候已經十二點了。想想昨天去新房子的時候好像聽到售樓小姐說可能要推遲交房了,現在住的房子住到7月份就到期,到時候新房子購置東西,封陽台,透氣還需要乙個月。看來還要多住上兩三個月了。掐指一算這個房子已經住了一年多了,租金交了快三萬。貴啊,crying。忽然神經質地想...

突發奇想 純網路版的作業系統

全世界分布一定數量的專用伺服器,這些伺服器就是做為資訊的儲存體和提供者.而我們個人的隨般裝置 智慧型手機,掌上電腦,或是以後會出現的可穿戴的電腦等 中已經不再需要硬碟,直接通過有線或無線裝置接入網路直接去伺服器上讀取想要的資訊.這種作業系統的出現肯定會帶動和刺激起微型裝置領域的一次大的發展,只要無線...