淺析C++中boost.variant的幾種訪問方法
Boost.Variant
Variant庫包含一個(gè)不同于union的泛型類,用于在存儲(chǔ)和操作來自于不同類型的對(duì)象。這個(gè)庫的一個(gè)特點(diǎn)是支持類型安全的訪問,減少了不同數(shù)據(jù)類型的類型轉(zhuǎn)換代碼的共同問題。
Variant 庫如何改進(jìn)你的程序?
•對(duì)用戶指定的多種類型的進(jìn)行類型安全的存儲(chǔ)和取回
•在標(biāo)準(zhǔn)庫容器中存儲(chǔ)不同類型的方法
•變量訪問的編譯期檢查
•高效的、基于棧的變量存儲(chǔ)
Variant 庫關(guān)注的是對(duì)一組限定類型的類型安全存儲(chǔ)及取回,即非無類的聯(lián)合。Boost.Variant 庫與 Boost.Any 有許多共同之外,但在功能上也有不同的考慮。在每天的編程中通常都會(huì)需要用到非無類的聯(lián)合(不同的類型)。保持類型安全的一個(gè)典型方法是使用抽象基類,但這不總是可以做到的;即使可以做得,堆分配和虛擬函數(shù)的代價(jià)也可能太高。你也可以嘗試用不安全的無類類型,如 void* (它會(huì)導(dǎo)致不幸),或者是類型安全得無限制的可變類型,如 Boost.Any. 這里我們將看到 Boost.Variant,它支持限定的可變類型,即元素來自于一組支持的類型。
下面將淺談variant的幾種訪問方法,一起來學(xué)習(xí)學(xué)習(xí)吧。
使用boost::get
boost::variant<int, std::string> v; v = "Hello world"; std::cout << boost::get<std::string>(v) << std::endl;
使用boost::get來訪問,需要給出原始類型,并且這樣做不安全,若類型錯(cuò)誤,程序?qū)?huì)拋出異常。
使用RTTI
void var_print(boost::variant<int, std::string>& v)
{
if (v.type() == typeid(int))
{
std::cout << get<int>(v) << std::endl;
}
else if (v.type() == typeid(std::string))
{
std::cout << get<std::string>(v) << std::endl;
}
// Else do nothing
}
int main()
{
boost::variant<int, std::string> v;
v = "Hello world";
var_print(v);
return 0;
}
使用RTTI技術(shù)可以避免類型訪問錯(cuò)誤而程序異常的情況,但是這樣做有點(diǎn)不優(yōu)雅,每增加一個(gè)類型,都需要修改if-else結(jié)構(gòu),并且使用RTTI會(huì)對(duì)程序性能有一定影響。
使用訪問者模式
class var_visitor : public boost::static_visitor<void>
{
public:
void operator()(int& i) const
{
std::cout << i << std::endl;
}
void operator()(std::string& str) const
{
std::cout << str << std::endl;
}
};
int main()
{
boost::variant<int, std::string> v;
v = "Hello world";
boost::apply_visitor(var_visitor(), v);
return 0;
}
使用該模式,需要定義一個(gè)類并繼承于boost::static_visitor,在類里面需要重載()操作符,通過boost::apply_visitor來訪問原始類型的值,這樣做還是有些繁瑣,每增加一個(gè)類型,都需要在var_visitor里面增加一個(gè)函數(shù),但比使用RTTI里面的修改if-else結(jié)構(gòu)好得多,因?yàn)槭褂迷L問者模式至少是遵循開放-封閉原則的,即對(duì)寫開放,對(duì)修改封閉。
使用模板函數(shù)
class var_visitor : public boost::static_visitor<void>
{
public:
template<typename T>
void operator()(T& i) const
{
std::cout << i << std::endl;
}
};
int main()
{
boost::variant<int, std::string> v;
v = "Hello world";
boost::apply_visitor(var_visitor(), v);
return 0;
}
將operator()改成了模板函數(shù)的好處就是不用關(guān)心variant支持多少類型。
總結(jié)
以上就是這篇文章的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用C++能有所幫助,如果有疑問大家可以留言交流。謝謝大家對(duì)我們的支持。
欄 目:C語言
下一篇:STL priority_queue(優(yōu)先隊(duì)列)詳解
本文標(biāo)題:淺析C++中boost.variant的幾種訪問方法
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2005.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子


