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

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

 更新時(shí)間:2022年11月20日 16:17:53   作者:無(wú)水先生  
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。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ù)的總稱

一、說(shuō)明

Boost.EnableIf

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

從 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ù)傳遞的類型的對(duì)象。該對(duì)象在 create() 中初始化,不接受任何參數(shù)。兩個(gè) create() 函數(shù)的簽名沒(méi)有區(qū)別。在這方面,create() 不是重載函數(shù)。如果 Boost.EnableIf 沒(méi)有啟用一個(gè)函數(shù)而禁用另一個(gè),編譯器將報(bào)告錯(cuò)誤。

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

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

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

示例 49.1 顯示提升。

示例 49.2。使用 boost::enable_if 為一組類型專門化函數(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 為一組類型特化一個(gè)函數(shù)。該函數(shù)稱為 print() 并需要一個(gè)參數(shù)。它可以被重載,盡管重載要求您使用具體類型。要對(duì)一組類型(如 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() 寫入標(biāo)準(zhǔn)輸出,無(wú)論類型是否支持后增量運(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)文章

最新評(píng)論

略阳县| 章丘市| 全南县| 安平县| 太保市| 北海市| 桃园市| 慈溪市| 延安市| 绩溪县| 庆云县| 威远县| 花莲市| 都兰县| 桃园市| 吉木萨尔县| 安达市| 星子县| 旬邑县| 河西区| 澳门| 花莲县| 潮安县| 拜城县| 城固县| 安丘市| 莆田市| 淮安市| 安徽省| 安泽县| 教育| 裕民县| 尖扎县| 绥滨县| 普安县| 县级市| 奇台县| 富阳市| 兰坪| 鸡西市| 隆回县|