最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?Boost?Conversion超詳細(xì)講解

 更新時(shí)間:2022年11月24日 14:35:31   作者:無水先生  
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱

一、說明

Boost.Conversion 在頭文件 boost/cast.hpp 中定義了轉(zhuǎn)換運(yùn)算符 boost::polymorphic_cast 和 boost::polymorphic_downcast。它們旨在更精確地處理類型轉(zhuǎn)換——通常使用 dynamic_cast 完成。

庫由兩個(gè)文件組成。分別在boost/cast.hpp文件中定義了boost::polymorphic_castboost::polymorphic_downcast這兩個(gè)類型轉(zhuǎn)換操作符, 在boost/lexical_cast.hpp文件中定義了boost::lexical_cast

二、示例和代碼

boost::polymorphic_castboost::polymorphic_downcast是為了使原來用dynamic_cast實(shí)現(xiàn)的類型轉(zhuǎn)換更加具體。具體細(xì)節(jié),如下例所示。

struct father 
{ 
  virtual ~father() { }; 
}; 
struct mother 
{ 
  virtual ~mother() { }; 
}; 
struct child : 
  public father, 
  public mother 
{ 
}; 
void func(father *f) 
{ 
  child *c = dynamic_cast<child*>(f); 
} 
int main() 
{ 
  child *c = new child; 
  func(c); 
  father *f = new child; 
  mother *m = dynamic_cast<mother*>(f); 
} 

本例使用dynamic_cast類型轉(zhuǎn)換操作符兩次: 在func()函數(shù)中,它將指向父類的指針轉(zhuǎn)換為指向子類的指針。在main()中, 它將一個(gè)指向父類的指針轉(zhuǎn)為指向另一個(gè)父類的指針。第一個(gè)轉(zhuǎn)換稱為向下轉(zhuǎn)換(downcast),第二個(gè)轉(zhuǎn)換稱為交叉轉(zhuǎn)換(cross cast)。

通過使用 Boost.Conversion 的類型轉(zhuǎn)換操作符,可以將向下轉(zhuǎn)換和交叉轉(zhuǎn)換區(qū)分開來。

#include <boost/cast.hpp> 
struct father 
{ 
  virtual ~father() { }; 
}; 
struct mother 
{ 
  virtual ~mother() { }; 
}; 
struct child : 
  public father, 
  public mother 
{ 
}; 
void func(father *f) 
{ 
  child *c = boost::polymorphic_downcast<child*>(f); 
} 
int main() 
{ 
  child *c = new child; 
  func(c); 
  father *f = new child; 
  mother *m = boost::polymorphic_cast<mother*>(f); 
} 

boost::polymorphic_downcast
 類型轉(zhuǎn)換操作符只能用于向下轉(zhuǎn)換。 它內(nèi)部使用 
static_cast
 實(shí)現(xiàn)類型轉(zhuǎn)換。 由于 
static_cast
 并不動(dòng)態(tài)檢查類型轉(zhuǎn)換是否合法,所以 
boost::polymorphic_downcast
 應(yīng)該只在類型轉(zhuǎn)換是安全的情況下使用。 在調(diào)試(debug builds)模式下, 
boost::polymorphic_downcast
 實(shí)際上在 
assert ()
函數(shù)中使用
 dynamic_cast
 驗(yàn)證類型轉(zhuǎn)換是否合法。 請(qǐng)注意這種合法性檢測(cè)只在定義了
NDEBUG
宏的情況下執(zhí)行,這通常是在調(diào)試模式下。

向下轉(zhuǎn)換最好使用boost::polymorphic_downcast, 那么boost::polymorphic_cast就是交叉轉(zhuǎn)換所需要的了。 由于dynamic_cast是唯一能實(shí)現(xiàn)交叉轉(zhuǎn)換的類型轉(zhuǎn)換操作符,boost::polymorphic_cast內(nèi)部使用了它。 由于boost::polymorphic_cast能夠在錯(cuò)誤的時(shí)候拋出std::bad_cast類型的異常,所以優(yōu)先使用這個(gè)類型轉(zhuǎn)換操作符還是很有必要的。相反,dynamic_cast在類型轉(zhuǎn)換失敗使將返回0。 避免手工驗(yàn)證返回值,boost::polymorphic_cast提供了自動(dòng)化的替代方式。

boost::polymorphic_downcastboost::polymorphic_cast只在指針必須轉(zhuǎn)換的時(shí)候使用;否則,必須使用dynamic_cast執(zhí)行轉(zhuǎn)換。 由于boost::polymorphic_downcast是基于static_cast,所以它不能夠,比如說,將父類對(duì)象轉(zhuǎn)換為子類對(duì)象。 如果轉(zhuǎn)換的類型不是指針,則使用boost::polymorphic_cast執(zhí)行類型轉(zhuǎn)換也沒有什么意義,而在這種情況下使用dynamic_cast還會(huì)拋出一個(gè)std::bad_cast異常。

雖然所有的類型轉(zhuǎn)換都可用dynamic_cast實(shí)現(xiàn),可boost::polymorphic_downcastboost::polymorphic_cast也不是真正隨意使用的。 Boost.Conversion 還提供了另外一種在實(shí)踐中很有用的類型轉(zhuǎn)換操作符。 體會(huì)一下下面的例子。

#include <boost/lexical_cast.hpp> 
#include <string> 
#include <iostream> 
int main() 
{ 
  std::string s = boost::lexical_cast<std::string>(169); 
  std::cout << s << std::endl; 
  double d = boost::lexical_cast<double>(s); 
  std::cout << d << std::endl; 
} 

類型轉(zhuǎn)換操作符boost::lexical_cast可將數(shù)字轉(zhuǎn)換為其他類型。 例子首先將整數(shù)169轉(zhuǎn)換為字符串,然后將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)。

boost::lexical_cast內(nèi)部使用流(streams)執(zhí)行轉(zhuǎn)換操作。 因此,只有那些重載了operator<<()operator>>()這兩個(gè)操作符的類型可以轉(zhuǎn)換。 使用boost::lexical_cast的優(yōu)點(diǎn)是類型轉(zhuǎn)換出現(xiàn)在一行代碼之內(nèi),無需手工操作流(streams)。 由于流的用法對(duì)于類型轉(zhuǎn)換不能立刻理解代碼含義, 而boost::lexical_cast類型轉(zhuǎn)換操作符還可以使代碼更有意義,更加容易理解。

請(qǐng)注意boost::lexical_cast并不總是訪問流(streams);它自己也優(yōu)化了一些數(shù)據(jù)類型的轉(zhuǎn)換。

如果轉(zhuǎn)換失敗,則拋出boost::bad_lexical_cast類型的異常,它繼承自std::bad_cast

#include <boost/lexical_cast.hpp> 
#include <string> 
#include <iostream> 
int main() 
{ 
  try 
  { 
    int i = boost::lexical_cast<int>("abc"); 
    std::cout << i << std::endl; 
  } 
  catch (boost::bad_lexical_cast &e) 
  { 
    std::cerr << e.what() << std::endl; 
  } 
} 

三、更多示例代碼

本例由于字符串 "abc" 不能轉(zhuǎn)換為int類型的數(shù)字而拋出異常。

示例 54.1。使用 dynamic_cast 向下和交叉投射

struct base1 { virtual ~base1() = default; };
struct base2 { virtual ~base2() = default; };
struct derived : public base1, public base2 {};
void downcast(base1 *b1)
{
  derived *d = dynamic_cast<derived*>(b1);
}
void crosscast(base1 *b1)
{
  base2 *b2 = dynamic_cast<base2*>(b1);
}
int main()
{
  derived *d = new derived;
  downcast(d);
  base1 *b1 = new derived;
  crosscast(b1);
}

Example54.1

示例 54.1 兩次使用了轉(zhuǎn)換運(yùn)算符 dynamic_cast:在 downcast() 中,它將指向基類的指針轉(zhuǎn)換為指向派生類的指針。在 crosscast() 中,它將指向基類的指針轉(zhuǎn)換為指向不同基類的指針。第一個(gè)轉(zhuǎn)換是向下轉(zhuǎn)換,第二個(gè)轉(zhuǎn)換是交叉轉(zhuǎn)換。 Boost.Conversion 中的轉(zhuǎn)換運(yùn)算符讓您可以區(qū)分向下轉(zhuǎn)換和交叉轉(zhuǎn)換。

示例 54.2。使用 polymorphic_downcast 和 polymorphic_cast 進(jìn)行向下和交叉轉(zhuǎn)換

#include <boost/cast.hpp>
struct base1 { virtual ~base1() = default; };
struct base2 { virtual ~base2() = default; };
struct derived : public base1, public base2 {};
void downcast(base1 *b1)
{
  derived *d = boost::polymorphic_downcast<derived*>(b1);
}
void crosscast(base1 *b1)
{
  base2 *b2 = boost::polymorphic_cast<base2*>(b1);
}
int main()
{
  derived *d = new derived;
  downcast(d);
  base1 *b1 = new derived;
  crosscast(b1);
}

boost::polymorphic_downcast(參見示例 54.2)只能用于向下轉(zhuǎn)型,因?yàn)樗褂?static_cast 來執(zhí)行轉(zhuǎn)換。因?yàn)?static_cast 不會(huì)動(dòng)態(tài)檢查轉(zhuǎn)換的有效性,boost::polymorphic_downcast 必須僅在轉(zhuǎn)換安全時(shí)使用。在調(diào)試版本中,boost::polymorphic_downcast 使用 dynamic_cast 和 assert() 來確保類型轉(zhuǎn)換有效。只有在未定義宏 NDEBUG 時(shí)才會(huì)執(zhí)行此測(cè)試,這通常是調(diào)試版本的情況。

boost::polymorphic_cast 是交叉轉(zhuǎn)換所必需的。 boost::polymorphic_cast 使用 dynamic_cast,它是唯一可以執(zhí)行交叉轉(zhuǎn)換的轉(zhuǎn)換運(yùn)算符。最好使用 boost::polymorphic_cast 而不是 dynamic_cast,因?yàn)榍罢咴诔霈F(xiàn)錯(cuò)誤時(shí)拋出 std::bad_cast 類型的異常,而 dynamic_cast 在類型轉(zhuǎn)換失敗時(shí)返回空指針。

僅使用 boost::polymorphic_downcast 和 boost::polymorphic_cast 來轉(zhuǎn)換指針;否則,使用 dynamic_cast。因?yàn)?boost::polymorphic_downcast 是基于 static_cast 的,所以它不能將基類的對(duì)象轉(zhuǎn)換為派生類的對(duì)象。此外,使用 boost::polymorphic_cast 轉(zhuǎn)換指針以外的類型沒有意義,因?yàn)槿绻D(zhuǎn)換失敗,dynamic_cast 將拋出 std::bad_cast 類型的異常。

到此這篇關(guān)于C++ Boost Conversion超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++ Boost Conversion內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)二叉樹非遞歸遍歷算法詳解

    C++實(shí)現(xiàn)二叉樹非遞歸遍歷算法詳解

    在C++中,二叉樹非遞歸遍歷是一種常用的算法,可避免遞歸過程中的系統(tǒng)開銷和棧溢出問題。非遞歸遍歷算法利用棧數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),可以實(shí)現(xiàn)前序、中序和后序遍歷,是C++程序員必備技能之一
    2023-04-04
  • C++學(xué)習(xí)心得之掃雷游戲

    C++學(xué)習(xí)心得之掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C++學(xué)習(xí)心得之掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++實(shí)現(xiàn)LeetCode(兩個(gè)有序數(shù)組的中位數(shù))

    C++實(shí)現(xiàn)LeetCode(兩個(gè)有序數(shù)組的中位數(shù))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(兩個(gè)有序數(shù)組的中位數(shù)),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言中字符串與各數(shù)值類型之間的轉(zhuǎn)換方法

    C語言中字符串與各數(shù)值類型之間的轉(zhuǎn)換方法

    這篇文章主要介紹了C語言中字符串與各數(shù)值類型之間的轉(zhuǎn)換方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++標(biāo)準(zhǔn)庫介紹及使用string類的詳細(xì)過程

    C++標(biāo)準(zhǔn)庫介紹及使用string類的詳細(xì)過程

    C++中將string封裝為單獨(dú)的類,string?類是?C++?標(biāo)準(zhǔn)庫中的一個(gè)非常重要的類,用于表示和操作字符串,這篇文章主要介紹了C++標(biāo)準(zhǔn)庫介紹及使用string類,需要的朋友可以參考下
    2024-08-08
  • C語言中scanf函數(shù)與空格回車的用法說明

    C語言中scanf函數(shù)與空格回車的用法說明

    這篇文章主要介紹了C語言中scanf函數(shù)與空格回車的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C語言 字符串首字母轉(zhuǎn)換成大寫簡單實(shí)例

    C語言 字符串首字母轉(zhuǎn)換成大寫簡單實(shí)例

    這篇文章主要介紹了C語言 字符串首字母轉(zhuǎn)換成大寫簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 詳解如何實(shí)現(xiàn)C++虛函數(shù)調(diào)用匯編代碼

    詳解如何實(shí)現(xiàn)C++虛函數(shù)調(diào)用匯編代碼

    多態(tài)是C++中最重要的特性之一,對(duì)虛函數(shù)的調(diào)用在C++代碼中是隨處可見的,本篇文章我們?cè)敿?xì)探討一下,感興趣的朋友快來看看吧
    2021-11-11
  • QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決

    QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決

    本文主要介紹了QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Qt中QMainWindow使用及技巧

    Qt中QMainWindow使用及技巧

    QMainWindow是Qt框架中提供的一個(gè)主窗口類,它具有菜單欄、工具欄、狀態(tài)欄等常見的GUI元素,本文就來介紹一下使用技巧,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10

最新評(píng)論

浑源县| 南和县| 深水埗区| 康乐县| 固阳县| 新昌县| 黑山县| 棋牌| 平顺县| 阿合奇县| 偏关县| 大厂| 城市| 平果县| 濮阳县| 正定县| 合江县| 辉南县| 九寨沟县| 铜鼓县| 翁牛特旗| 聂拉木县| 开远市| 湖北省| 通州区| 浏阳市| 彭水| 宜昌市| 琼中| 全椒县| 香港 | 长治市| 资阳市| 奈曼旗| 唐河县| 安西县| 邹城市| 岚皋县| 枣庄市| 永平县| 饶河县|