cast<> 定義在 llvm/include/llvm/Support/[[Casting.h]], 參見 [[isa]]安全
== cast<> ==
操做符 cast<> 表示一個「帶檢查的類型轉換」操做。它將一個基類的指針或引用轉化爲派生類的,若是指針或引用不是所給類型的實例則會產生一個斷言失敗。This should be used in cases where you have some information that makes you believe that something is of the right type. An example of the isa<> and cast<> template is:函數
<syntaxhighlight lang="cpp">
static bool isLoopInvariant(const Value *V, const Loop *L) {
if (isa<Constant>(V) || isa<Argument>(V) || isa<GlobalValue>(V))
return true;oop
// Otherwise, it !MUST be an instruction...
return !L->contains(cast<Instruction>(V)->getParent());
}
</syntaxhighlight>學習
(MUST 我標出該詞,表示確信通過前面的 isa<> 檢查,V 指針 '''必定''' 是 Instruction 類型的。)設計
== 實現機理 ==指針
=== 模板類 cast_retty_impl<TO, FROM> ===
用於計算 cast<> 的返回類型,其根據 FROM 類型、TO 類型計算。這個模板類經過特化處理
<const FROM>, <FROM *>, <const FROM*>, <const FROM* const> 等多種狀況,從
而計算出正確的返回 ret_type。orm
=== 模板類 cast_retty_wrap<TO, FROM, SimpleFROM> ===
此模板用於根據 TO, FROM, SimpleFROM 三個模板參數計算出 cast<> 的返回類型。get
當 FROM 類型和 SimpleFROM 類型不一樣的時候,使用 simplify_type 來簡化 SimpleFROM 的
類型,並從新調用 cast_retty<> 來計算結果返回類型。(這裏相似於 isa<> 中的計算)it
當 FROM 類型和 SimpleFROM 類型相同時,使用 cast_retty_wrap<TO, FROM, FROM> 的
特化版本,則直接使用 FROM 對應的返回類型,使用 cast_retty_impl<TO, FROM> 實現。io
=== 模板類 cast_retty<TO, FROM> ===
設 SimpleFROM = simplify_type<FROM>::SimpleType,則此模板類實際調用
cast_retty_wrap<TO, FROM, SimpleFROM> 來計算返回類型。通常而言,FROM == SimpleFROM。
(也相似於 isa<> 中的計算)
對於特定的類,如 Optional<T>,有本身特化的 simplify_type<> 實現,於是會致使
FROM != SimpleFROM,待學習 Optional 的時候,再仔細分析吧。
=== 模板類 cast_convert_val<TO, FROM, SimpleFROM> ===
其特化版本 cast_convert_val<TO, FROM, FROM> 提供的函數 doit(val),用於獲得轉換爲
ret_type 的 val 值,這一轉換簡化寫法爲:
FROM &f = const_cast<FROM&>(val);
ret_type r = (ret_type)f;
其中第二步,使用的轉換能夠對任何不兼容的類型進行,實在不太安全?爲什麼不用 static_cast 呢?
非特化版本 cast_convert_val<> 會使用 simplify_type<> 得到類型的非簡單值(non-simple),
某些靈巧指針類(smart pointers)特化了 simplify_type<> 的實現,使得 FROM != SimpleFROM
的狀況得以產生並處理。
=== cast<> ===
模板函數 cast<To>(const From &f) 轉換指定參數 f 到所給類型 To。此轉換(cast)操做將斷言
類型是正確可轉換的(使用 isa<> 模板函數來斷定),所以其在失敗的時候不是返回 null 而是產生
斷言錯。其不容許空指針做爲參數,由於那樣 isa<> 函數調用會發生保護錯。例子:
cast<Instruction>(myVal)->getParent()
實現時,調用 cast_convert_val<To, From, SimpleFrom>,其中 SimpleFrom =
simplify_type<From>::SimpleType。對於特定的 smart pointer 類,可能 From != SimpleFrom。
== 小結 == isa<>, cast<> 等模板類使用了多個輔助模板類來幫助計算返回類型、類型簡化、根據不一樣類型特化 返回類型或特徵。其設計彷佛和 smart pointer,Value 派生類體系有關,所以須要在後面看到 它們的時候,再進一步進行分析學習。