C++ Boost TypeTraits庫使用詳解
一、說明
反省是重點中的重點,泛型在實踐中貫穿工程的始終。以下庫支持泛型編程。無需詳細了解模板元編程即可使用這些庫。 Boost.TypeTraits 提供了檢查類型屬性的函數。 Boost.EnableIf 可以與 Boost.TypeTraits 一起使用,例如,根據函數的返回類型重載函數。 Boost.Fusion 使創(chuàng)建異構容器成為可能——其元素可以具有不同類型的容器。
二、庫Boost.TypeTraits
類型具有泛型編程所利用的不同屬性。 Boost.TypeTraits 庫提供了確定和更改類型屬性所需的工具。
從 C++11 開始,Boost.TypeTraits 提供的一些函數可以在標準庫中找到。您可以通過頭文件 type_traits 訪問這些函數。然而,Boost.TypeTraits 提供了額外的功能。
示例 48.1。確定類型類別
#include <boost/type_traits.hpp>
#include <iostream>
using namespace boost;
int main()
{
std::cout.setf(std::ios::boolalpha);
std::cout << is_integral<int>::value << '\n';
std::cout << is_floating_point<int>::value << '\n';
std::cout << is_arithmetic<int>::value << '\n';
std::cout << is_reference<int>::value << '\n';
}示例 48.1 調用了幾個函數來確定類型類別。 boost::is_integral 檢查一個類型是否是整數——它是否可以存儲整數。 boost::is_floating_point 檢查類型是否存儲浮點數。 boost::is_arithmetic 檢查類型是否支持算術運算符。并且 boost::is_reference 可用于確定類型是否為引用。
boost::is_integral 和 boost::is_floating_point 是互斥的。類型存儲整數或浮點數。但是,boost::is_arithmetic 和 boost::is_reference 可以應用于多個類別。例如,整數和浮點類型都支持算術運算。
Boost.TypeTraits 中的所有函數都提供一個 true 或 false 值的結果。示例 48.1 為 is_integral<int> 和 is_arithmetic<int> 輸出 true,為 is_floating_point<int> 和 is_reference<int> 輸出 false。因為所有這些函數都是模板,所以在運行時不會處理任何事情。該示例在運行時的行為就像在代碼中直接使用值 true 和 false 一樣。
在示例 48.1 中,各種函數的結果是 bool 類型的值,可以直接寫入標準輸出。如果結果要由函數模板處理,則應將其作為類型而不是布爾值轉發(fā)。
示例 48.2。 boost::true_type 和 boost::false_type
#include <boost/type_traits.hpp>
#include <iostream>
using namespace boost;
int main()
{
std::cout.setf(std::ios::boolalpha);
std::cout << is_same<is_integral<int>::type, true_type>::value << '\n';
std::cout << is_same<is_floating_point<int>::type, false_type>::value <<
'\n';
std::cout << is_same<is_arithmetic<int>::type, true_type>::value << '\n';
std::cout << is_same<is_reference<int>::type, false_type>::value << '\n';
}除了值,來自 Boost.TypeTraits 的函數還提供類型結果。 value 是一個 bool 值,type 是一個類型。就像只能設置為 true 或 false 的值一樣,類型只能設置為兩種類型之一:boost::true_type 或 boost::false_type。 type 允許您將函數的結果作為類型傳遞給另一個函數。
示例 48.2 使用了另一個來自 Boost.TypeTraits 的函數,稱為 boost::is_same。此函數需要兩種類型作為參數并檢查它們是否相同。要將 boost::is_integral、boost::is_floating_point、boost::is_arithmetic 和 boost::is_reference 的結果傳遞給 boost::is_same,必須訪問 type。然后將類型與 boost::true_type 或 boost::false_type 進行比較。然后再次讀取 boost::is_same 的結果。因為這是一個布爾值,所以它可以寫入標準輸出。
示例 48.3。使用 Boost.TypeTraits 檢查類型屬性
#include <boost/type_traits.hpp>
#include <iostream>
using namespace boost;
int main()
{
std::cout.setf(std::ios::boolalpha);
std::cout << has_plus<int>::value << '\n';
std::cout << has_pre_increment<int>::value << '\n';
std::cout << has_trivial_copy<int>::value << '\n';
std::cout << has_virtual_destructor<int>::value << '\n';
}示例 48.3 介紹了檢查類型屬性的函數。 boost::has_plus 檢查類型是否支持運算符 operator+ 以及是否可以連接兩個相同類型的對象。 boost::has_pre_increment 檢查類型是否支持預遞增運算符 operator++。 boost::has_trivial_copy 檢查一個類型是否有一個平凡的復制構造函數。 boost::has_virtual_destructor 檢查類型是否具有虛擬析構函數。
示例 48.3 顯示 true 三次, false 一次。
示例 48.4。使用 Boost.TypeTraits 改變類型屬性
#include <boost/type_traits.hpp>
#include <iostream>
using namespace boost;
int main()
{
std::cout.setf(std::ios::boolalpha);
std::cout << is_const<add_const<int>::type>::value << '\n';
std::cout << is_same<remove_pointer<int*>::type, int>::value << '\n';
std::cout << is_same<make_unsigned<int>::type, unsigned int>::value <<
'\n';
std::cout << is_same<add_rvalue_reference<int>::type, int&&>::value <<
'\n';
}示例 48.4 說明了如何更改類型屬性。 boost::add_const 添加常量到一個類型。如果類型已經是常量,則沒有任何變化。代碼編譯沒有問題,類型保持不變。
boost::remove_pointer 從指針類型中刪除星號并返回指針引用的類型。 boost::make_unsigned 將帶符號的類型轉換為不帶符號的類型。 boost::add_rvalue_reference 將類型轉換為右值引用。
示例 48.4 將 true 寫入標準輸出四次。
到此這篇關于C++ Boost TypeTraits庫使用詳解的文章就介紹到這了,更多相關C++ Boost TypeTraits內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于PCL出現"無法找到?pcl_commond.dll?文件程序無法執(zhí)行"的問題及解決方法
這篇文章主要介紹了PCL出現"無法找到?pcl_commond.dll?文件程序無法執(zhí)行"的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
基于對話框程序中讓對話框捕獲WM_KEYDOWN消息的實現方法
下面我們將通過程序給大家演示基于對話框的應用程序對WM_KEYDOWN消息的捕獲。需要的朋友可以參考下2013-05-05

