欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ Boost EnableIf函數(shù)使用介紹

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

一、說(shuō)明

Boost.EnableIf

Boost.Enable If 可以禁用重載函數(shù)模板或?qū)S妙?lèi)模板。禁用意味著編譯器忽略相應(yīng)的模板。這有助于防止出現(xiàn)模棱兩可的情況,即編譯器不知道要使用哪個(gè)重載函數(shù)模板。它還可以更輕松地定義不僅可用于特定類(lèi)型而且可用于一組類(lèi)型的模板。

從 C++11 開(kāi)始,Boost.EnableIf 已經(jīng)成為標(biāo)準(zhǔn)庫(kù)的一部分。您可以在不使用 Boost 庫(kù)的情況下調(diào)用本章介紹的函數(shù);只需包含頭文件 type_traits。

二、Boost.EnableIf的示例

示例 49.1。在返回值上使用 boost::enable_if 重載函數(shù)

#include <boost/utility/enable_if.hpp>
#include <type_traits>
#include <string>
#include <iostream>
template <typename T>
typename boost::enable_if<std::is_same<T, int>, T>::type create()
{
  return 1;
}
template <typename T>
typename boost::enable_if<std::is_same<T, std::string>, T>::type create()
{
  return "Boost";
}
int main()
{
  std::cout << create<std::string>() << '\n';
}

Example49.1

示例 49.1 定義了函數(shù)模板 create(),它返回作為模板參數(shù)傳遞的類(lèi)型的對(duì)象。該對(duì)象在 create() 中初始化,不接受任何參數(shù)。兩個(gè) create() 函數(shù)的簽名沒(méi)有區(qū)別。在這方面,create() 不是重載函數(shù)。如果 Boost.EnableIf 沒(méi)有啟用一個(gè)函數(shù)而禁用另一個(gè),編譯器將報(bào)告錯(cuò)誤。

Boost.EnableIf 提供類(lèi) boost::enable_if,這是一個(gè)需要兩個(gè)參數(shù)的模板。第一個(gè)參數(shù)是條件。如果條件為真,第二個(gè)參數(shù)是 boost::enable_if 表達(dá)式的類(lèi)型。訣竅在于,如果條件為假,則此類(lèi)型不存在,在這種情況下,boost::enable_if 表達(dá)式是無(wú)效的 C++ 代碼。然而,當(dāng)涉及到模板時(shí),編譯器不會(huì)抱怨無(wú)效代碼。相反,它會(huì)忽略模板并搜索另一個(gè)可能適合的模板。這個(gè)概念被稱(chēng)為 SFINAE,它代表“替換失敗不是錯(cuò)誤”。

在示例 49.1 中,boost::enable_if 表達(dá)式中的兩個(gè)條件都使用類(lèi) std::is_same。此類(lèi)在 C++11 標(biāo)準(zhǔn)庫(kù)中定義,允許您比較兩種類(lèi)型。因?yàn)檫@樣的比較不是真就是假,所以使用 std::is_same 來(lái)定義條件就足夠了。

如果條件為真,相應(yīng)的 create() 函數(shù)應(yīng)返回作為模板參數(shù)傳遞給 create() 的類(lèi)型的對(duì)象。這就是 T 作為第二個(gè)參數(shù)傳遞給 boost::enable_if 的原因。如果條件為真,則整個(gè) boost::enable_if 表達(dá)式將替換為 T。在示例 49.1 中,編譯器會(huì)看到返回 int 的函數(shù)或返回 std::string 的函數(shù)。如果使用 int 或 std::string 以外的任何其他類(lèi)型調(diào)用 create(),編譯器將報(bào)告錯(cuò)誤。

示例 49.1 顯示提升。

示例 49.2。使用 boost::enable_if 為一組類(lèi)型專(zhuān)門(mén)化函數(shù)

#include <boost/utility/enable_if.hpp>
#include <type_traits>
#include <iostream>
template <typename T>
void print(typename boost::enable_if<std::is_integral<T>, T>::type i)
{
  std::cout << "Integral: " << i << '\n';
}
template <typename T>
void print(typename boost::enable_if<std::is_floating_point<T>, T>::type f)
{
  std::cout << "Floating point: " << f << '\n';
}
int main()
{
  print<short>(1);
  print<long>(2);
  print<double>(3.14);
}

Example49.2

示例 49.2 使用 boost::enable_if 為一組類(lèi)型特化一個(gè)函數(shù)。該函數(shù)稱(chēng)為 print() 并需要一個(gè)參數(shù)。它可以被重載,盡管重載要求您使用具體類(lèi)型。要對(duì)一組類(lèi)型(如 short、int 或 long)執(zhí)行相同的操作,您可以使用 boost::enable_if 定義適當(dāng)?shù)臈l件。示例 49.2 使用 std::is_integral 來(lái)做到這一點(diǎn)。第二個(gè) print() 函數(shù)為所有浮點(diǎn)數(shù)重載了 std::is_floating_point。

練習(xí)

使 print_has_post_increment() 寫(xiě)入標(biāo)準(zhǔn)輸出,無(wú)論類(lèi)型是否支持后增量運(yùn)算符。例如,對(duì)于 int 程序應(yīng)該輸出“int has a post increment operator”:

#include <string>
template <class T>
void print_has_post_increment()
{
    // TODO: Implement this function.
}
int main()
{
    print_has_post_increment<int>();
    print_has_post_increment<long>();
    print_has_post_increment<std::string>();
}

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

相關(guān)文章

  • C++基于EasyX圖形庫(kù)實(shí)現(xiàn)2048小游戲

    C++基于EasyX圖形庫(kù)實(shí)現(xiàn)2048小游戲

    這篇文章主要為大家詳細(xì)介紹了C++基于EasyX圖形庫(kù)實(shí)現(xiàn)2048小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++ move semantic移動(dòng)語(yǔ)義介紹

    C++ move semantic移動(dòng)語(yǔ)義介紹

    首先,移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)這兩個(gè)概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來(lái)使用。本篇會(huì)從C++的值類(lèi)型,到移動(dòng)拷貝與移動(dòng)賦值來(lái)理解移動(dòng)語(yǔ)義與完美轉(zhuǎn)發(fā)
    2022-08-08
  • C++服務(wù)器和客戶(hù)端交互的項(xiàng)目實(shí)踐

    C++服務(wù)器和客戶(hù)端交互的項(xiàng)目實(shí)踐

    本文主要介紹了C++服務(wù)器和客戶(hù)端交互的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C++中的字符串編碼處理方法

    C++中的字符串編碼處理方法

    這篇文章主要介紹了C++中的字符串編碼處理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • 關(guān)于C++菱形運(yùn)算符深度解析

    關(guān)于C++菱形運(yùn)算符深度解析

    從語(yǔ)言標(biāo)準(zhǔn)來(lái)說(shuō),c++里沒(méi)有什么菱形運(yùn)算符,c++20里雖然新增了一個(gè)運(yùn)算符operator<=>,但這個(gè)和所謂的菱形運(yùn)算符沒(méi)有任何關(guān)系,下面通過(guò)本文探討C++里也有菱形運(yùn)算符嗎這一問(wèn)題探討,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Qt重寫(xiě)QTreeView自繪實(shí)現(xiàn)酷炫樣式

    Qt重寫(xiě)QTreeView自繪實(shí)現(xiàn)酷炫樣式

    QTreeView,顧名思義,就是一種樹(shù)形的控件,在我們需要做類(lèi)似于文件列表的視圖時(shí),是一個(gè)不錯(cuò)的選擇,下面我們就來(lái)看看qt如何重寫(xiě)QTreeView實(shí)現(xiàn)酷炫樣式,感興趣的可以了解一下
    2023-08-08
  • C語(yǔ)言詳細(xì)講解注釋符號(hào)的使用

    C語(yǔ)言詳細(xì)講解注釋符號(hào)的使用

    C語(yǔ)言的注釋符是以“/*”開(kāi)頭并以“*/”結(jié)尾的串。在“/*”和“*/”之間的即為注釋。程序編譯時(shí),不對(duì)注釋作任何處理。注釋可出現(xiàn)在程序中的任何位置。注釋用來(lái)向用戶(hù)提示或解釋程序的意義。在調(diào)試程序中對(duì)暫不使用的語(yǔ)句也可用注釋符括起來(lái),使翻譯跳過(guò)不作處理
    2022-04-04
  • C++ Boost Heap使用實(shí)例詳解

    C++ Boost Heap使用實(shí)例詳解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)
    2022-11-11
  • c++中vector<int>和vector<int*>的用法及區(qū)別

    c++中vector<int>和vector<int*>的用法及區(qū)別

    這篇文章主要介紹了c++中vector<int>和vector<int*>的用法及區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2013-10-10
  • C語(yǔ)言實(shí)現(xiàn)文件讀寫(xiě)操作的幾種常用方法

    C語(yǔ)言實(shí)現(xiàn)文件讀寫(xiě)操作的幾種常用方法

    C語(yǔ)言提供了一系列文件操作函數(shù),使得我們可以通過(guò)程序?qū)ξ募M(jìn)行讀寫(xiě)操作,本文主要介紹了C語(yǔ)言實(shí)現(xiàn)文件讀寫(xiě)操作的幾種常用方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評(píng)論