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,例如:
- 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;
}
參考文獻
編輯頁面Template:ReflistH/styles.css沒有內容。