很多時候由於一些限制,我們的函式宣告引數只能為一種型別。然而我們的實參又必須要相容另一種型別,這時候就可以利用乙個中間型別,來進行乙個隱式轉換。典型的例子就是c++ auto_ptr的實現。
auto_ptr所界定的是一種嚴格的擁有權觀念,也就是說auto_ptr的copy建構函式和賦值函式都是擁有權的轉移,我們需要在函式中修改auto_ptr本身。也就是說auto_ptr的copy構造函式引數不能宣告為const.
//不能這樣申請
auto_ptr(const
auto_ptr& rhs)
//只能這樣
auto_ptr(auto_ptr& rhs)
但是這樣一來,我們就不能寫出右值作為引數的**,因為只有const才能指向(引用)右值。比如下面這些語句,就會編譯報錯。
auto_ptr
p(auto_ptr
(new
int(3)));
那怎麼來解決這個問題呢?那就是用乙個中間變數來轉換下。我們引入auto_ptr_ref
template
struct auto_ptr_ref
};
同時向auto_ptr中加入如下**
template
operator auto_ptr_ref() throw()
auto_ptr(auto_ptr_refrhs) throw()
:ap(rhs.yp)
{}
加入以上**後,編譯就能過了。還是以如下**為例:
auto_ptr
p(auto_ptr
(new
int(3)));
編譯器首先處理auto_ptr(new int(3)),這裡面生成了乙個臨時變數。
編譯器將臨時變數丟給auto_ptr p()中繼續構造,臨時變數為const。但是auto_ptr中並沒有auto_ptr(const auto_ptr& rsh)這個方法,於是編譯器就試試看有沒有其他辦法。
這時候編譯器開始嘗試用其他方法解決問題,它注意到了有乙個operator是 auto_ptr_ref()的東西,於是編譯器嘗試隱式轉換是否能夠成功,這次它成功了,並且產生了乙個auto_ptr_ref
編譯器將auto_ptr_ref甩給auto_ptr p()繼續嘗試構造,這時候編譯器發現有乙個方法auto_ptr(auto_ptr_ref<_ty> _right),而且這裡面的引數不是引用,而是常值呼叫,編譯器非常高興的將auto_ptr_ref交給auto_ptr從而完成了構造
C語言 程式設計小技巧(二)
引數的書寫要完整,不要貪圖省事只寫引數的型別而省略引數名字。如果函式沒有引數,則用void填充。例如 voidsetvalue intwidth,intheight 良好的風格 voidsetvalue int int 不良的風格 floatgetvalue void 良好的風格 floatgetv...
C語言小技巧 1 實現可變引數
先看下面的 intmax intn,return ret 我們可以這樣使用這個函式 max 2,1,1 結果是 1.max 4,1,2,1,2 結果是 2.php函式的原始c 實現,用了乙個巨集php function,就用到了類似的原理。c語言裡面的經典函式 printf 也用到了這個可變引數的特...
幾個C 程式設計的小技巧 二
幾個c 程式設計的小技巧 二 一 判斷檔案或資料夾是否存在 使用system.io.file,要檢查乙個檔案是否存在非常簡單 bool exist system.io.file.exists filename 如果需要判斷目錄 資料夾 是否存在,可以使用system.io.directory boo...