標籤:boost implicit cast 類型轉換
在C++中有四種類型轉換
1、static_cast:這個是最常用的類型轉換,凡是C++隱式執行的類型轉換都可以用static_cast顯式完成。在隱式轉換時有時編譯器會有警告資訊,但是顯示轉換就不會有。
2、const_cast:從名字可以看出和const有關,這個轉換的作用是去除或添加const特性,它可以將一個const變數轉換為非const變數,或將一個非const變數轉換為const變數。
3、dynamic_cast:這個是運行時檢查該類型轉換是否安全。被轉換的類型必須是多態(即有虛函數)。詳細可參考這裡
4、interpret_cast:interpret意思為重新解釋,意思為將資料的二進位格式重新解釋,它依賴機器。
在boost庫中有個implicit_cast。這個表示“隱式”轉換,即可以隱式轉換的地方才可以用它。以一個例子說明,在菱形繼承中,最底層的對象可以轉換為中層對象
#include<boost/implicit_cast.hpp>#include<iostream>class Top{};class MiddleA:public Top{};class MiddleB:public Top{};class Bottom:public MiddleA,public MiddleB{};void Function(MiddleA& A){ std::cout<<"MiddleA Function"<<std::endl;}void Function(MiddleB& B){ std::cout<<"MiddleB Function"<<std::endl;}int main(){ Bottom bottom; Function(bottom); return 0;}
這時如果編譯,就會出現錯誤,因為在調用函數Function時,bottom既可以預設轉換為MiddleA,也可以預設轉換為MiddleB,如果不明確指出就會出現歧義。這時可以改為:
Function(static_cast<MiddleA&>(bottom));
或
Function(static_cast<MiddleB&>(bottom));
程式可以運行了。但是如果不小心這樣使用了:
Top top;Function(static_cast<MiddleB&>top);
這樣編譯可以通過,但是在運行時可以崩潰,因為top不是“一種”MiddleB,但是編譯器不能發現這個問題,這時如果用implicit_cast就不會有這個問題了,在編譯時間就會給出錯誤資訊。
在轉換時up-cast不會有問題,因為派上類就是一種基類,它包含基類所有資訊。但是基類不是一種派上類,如果down-cast就可能有問題。
static_cast比較強大,可以執行上述兩種轉換。但是implicit_cast比較弱一點,只能執行up-cast。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
boost::implicit_cast