C++/Utility
外觀
< C++
<Utility> 是從C++11正式引入C++標準程式庫中的一個頭文件,定義了C++標準中幾個不相關領域的工具:
類
[編輯]- Pairs: 可以保存兩個不同類型值的對象: pair
- make_pair:不需要指出模板參數類型,就可以構造pair,例如:
make_pair(42,7.77)
生成的是std::pair<int,double>實例 - piecewise_construct_t是一個空類,用於辨識出pair::pair(piecewise_construct_t, tuple, tuple)
- piecewise_construct是piecewise_construct_t的一個實例對象
- make_pair:不需要指出模板參數類型,就可以構造pair,例如:
- template< class T > struct tuple_size,繼承自std::integral_constant。用於在編譯時獲取給定std::tuple或std:;pair或std::array類型包含的元質數量。
- template< class T > constexpr std::size_t tuple_size_v = tuple_size<T>::value; 為C++17引入。
- template< std::size_t I, class T > struct tuple_element; 用於在編譯時獲取 std::tuple 中特定位置元素的類型信息。
- template< std::size_t I, class T > using tuple_element_t = typename tuple_element<I, T>::type; 為C++17引入。
- template< class T, T... Ints > class integer_sequence; 編譯時整數序列。
- template< std::size_t... Ints > using index_sequence = std::integer_sequence<std::size_t, Ints...>;
- template< class T, T N > using make_integer_sequence = std::integer_sequence<T, /* a sequence 0, 1, 2, ..., N-1 */>;
- template< std::size_t N > using make_index_sequence = std::make_integer_sequence<std::size_t, N>;
- template< class... T > using index_sequence_for = std::make_index_sequence<sizeof...(T)>;
函數
[編輯]- Generic relational operators: 在特定命名空間rel_ops中給出了關係運算符 !=, >, <= , >=的標準定義.用戶只需先行定義兩個關係運算符==與<。
- Rvalue casts (C++11): 允許產生右值引用: forward, move, move_if_noexcept, declval.
- move_if_noexcept:返回實參對象的右值引用,如果參數類型是不拋出異常(nothrow guarantee)的移動可構造或是不可複製構造的;否則(除非複製比移動時更好的選擇,至少有強異常安全保證),返回左值引用。 強異常安全保證(strong guarantee,strong exception safety),或稱提交或卷回的語義(commit or rollback semantics),或無變化保證(no-change guarantee),是指運行可以是失敗,但失敗的運行保證不會有負效應,因此所有涉及的數據都保持代碼運行前的初始值。
- declval 函數模板:返回模板參數類型 T的右值引用但未綁定任何對象。用於不求值的運算符(unevaluated operands),如sizeof或decltype。T可以是不完整類型。 是幫助函數(helper function)用於引用類的成員,但該類的構造函數形參是未知的或是不可構造的類(如抽象基類)。 decltype 作用於表達式,返回表達式的類型;declval 作用於類型,返回該類型的表達式(準確的來說是該類型加上右值引用的類型)。declval 只能在編譯期間生效的語句里,比如 decltype , sizeof 還有模板元編程中。否則會報錯。由於不存在引用指針這種類型,所以如果T是引用類型時,
decltype(*(T *)nullptr) j = m; //错误
由於在編譯期使用,declval不需要類型T 有構造函數;另外,由於存在引用摺疊,注意declval 最終表達式的類型。
- Generic swap function: 通用的交換函數。STL庫中,特別是容器,大量調用了swap函數,並採取未限定方式(unqualified manner)以允許用戶對非基礎類型自寫的swap函數被STL重載調用。這通常是把非基礎類型的聲明與相關的swap函數聲明放在同一個命名空間中,編譯器通過依賴於實參的名字查找(argument-dependent lookup)即可調用這個重載版本。
例子程序
[編輯]// swap algorithm example (C++11)
#include <iostream> // std::cout
#include <utility> // std::swap
using namespace std;
namespace foo{
struct int1 {
int _val;
int1(int p):_val(p) {};
};
void swap(int1& a, int1& b)
{
cout << "my swap" << endl;
int1 i(a);
a = b;
b = i;
};
}
using namespace foo;
int main() {
int1 x = 10, y = 20; // x:10 y:20
swap(x, y); // x:20 y:10
return 0;
}