c 小技巧 二 函式引數可以利用中間變數轉換

2021-08-10 17:22:34 字數 1311 閱讀 4624

很多時候由於一些限制,我們的函式宣告引數只能為一種型別。然而我們的實參又必須要相容另一種型別,這時候就可以利用乙個中間型別,來進行乙個隱式轉換。典型的例子就是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...