boost::implicit_cast

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.