boost的轉換函式是對c++中的四種型別轉換函式(const_cast,reinterpret_cast,static_cast,dynamic_cast)的一些補充和擴充套件,在閱讀本文前,請先熟悉c++中的四種型別轉換函式相關知識。
c++提供了dynamic_cast來實現執行時的型別轉換,但是如果用來轉換指標時,需要記得檢查返回值(這是很多程式設計師容易忘掉的地方),否則一旦轉換失敗,將獲得乙個null指標,無異於給程式埋下了乙個定時炸彈。
boost的polymorphic_cast在dynamic_cast的基礎上增加了對返回值的檢測,如果轉換失敗,它就會丟擲std::bad_cast異常。其函式體如下:
template
inline target polymorphic_cast(source* x boost_explicit_default_target)
雖然拋異常增加了開銷,但使用起來卻更加簡單了。
由於丟擲異常會降低程式的效率,而且dynamic_cast更會查詢乙個type_info結構來確定正確的型別,所以不管是空間上的成本還是時間上的成本,都會大大增加。在一些應用場景中,只需要在編譯期間進行型別轉換即可。這時我們可以使用static_cast來實現編譯期間的型別轉換,但static_cast可能導致錯誤的型別轉換:
struct a };
class b:public a{};
class c:public a{};
int main()
對於上述程式,雖然pa和pb間沒有繼承關係,但是這個轉換卻可以通過,執行時也不會報任何錯誤,可一旦對pb進行訪問,就會得到錯誤的結果甚至直接導致程式死掉。
polymorphic_downcast就巧妙的解決的這一問題,首先還是先看看它的定義:
template
inline target polymorphic_downcast(source* x boost_explicit_default_target)
從它的定義可以看出,在執行release模式下,它和是static_cast一樣的,也就是說它的release版具有和static_cast一樣的開銷。但在debug模式下,它會首先進行一次動態轉換,而一旦型別不匹配,就會丟擲異常。
在上述程式中,如果用polymorphic_downcast來替換static_cast的話,我們可以先在debug模式下執行程式,如果有錯誤的型別轉換,將很容易的檢測出來。待改正所有的錯誤後,再發布release版,這樣即沒有動態轉換造成的開銷,又杜絕了錯誤的型別轉換。
BOOST 函式物件
可用於替換來自c 標準的std bind1st std bind2nd 函式 boost.ref通常和boost.bind一起使用。提供 boost ref 和boost cref 由於boost bind 會複製它的引數,因此當要用於boost bind 的函式帶有至少乙個引用引數時,引用必須特別...
boost中型別轉換學習
型別轉換在很多時候需要使用上,方便且安全的轉換是很有必要的。從c語言的一些api到c 中提供的stringstream流都有很多方式可以實現,了解他們的特點可以讓我們在日常編碼中編寫出漂亮的 一 c語言中常用的型別轉換 char szbuf 100 int nvalue 100000000 spri...
利用boost庫實現位元組間的轉換
由於要做c 和其他語言間的通訊,都是把char型別轉到到utf8傳輸的,所以就要實現位元組間的轉換了.由於平常一直在windows下寫 的,所以用 widechartomultibyte,multibytetowidechar轉換很方便,現在由於要實現程式可以跨平台執行,因此只能換其他方案了.本來剛...