STL運用的C 技術(3) 模板實參推斷

2021-06-16 06:56:47 字數 1346 閱讀 4657

stl是c++標準庫的重要組成部分之一,它不僅是乙個可復用的元件庫,更是乙個包含演算法與資料結構的軟體框架,同時也是c++泛型程式設計的很好例子。stl中運用了許多c++的高階技術。本文介紹模板實參推斷的運用。主要參考了《c++ primer》和《stl原始碼剖析》。

stl利用模板模板實現的,比如它的演算法都是乙個個的函式模板。我們知道模板是乙個公式或是藍圖,本身不是類或是函式,需進行例項化的過程。這個過程是在編譯期完成的,編譯器根據傳遞的實參,推斷出形參的型別,從而例項化相應的函式。《c++ primer》中的定義:從函式實參確定模板實參的型別和值的過程叫做模板實參推斷(template argument deduction)。下面給出stl中的幾個演算法,名字上做了簡單的修改,略去了部分**。

//較小值

template inline const t& min(const t& a, const t& b)

//較大值

template inline const t& max(const t& a, const t& b)

以下使用時,編譯器就會根據實參例項化min的兩個版本。
int main()

//交換兩個迭代器所指的元素

template inline void iter_swap(iter1 a, iter2 b)

iter_swap 函式利用模板實參推斷來獲取迭代器所指的資料型別。但是如果希望該函式返回第乙個迭代器的資料時,該怎麼辦呢?模板實參推斷是無能為力了,可以利用內嵌型別,如下定義即可。注意必須加關鍵字typename,用於告訴編譯器這是個型別,否則編譯無法通過。

#include #include #include using namespace std;

//萃取劑

templatestruct iterator_traits;

//特化 原生指標

templatestruct iterator_traits;

//特化 原生常指標

templatestruct iterator_traits;

//真正的交換函式

template inline void _iter_swap(iter1 a, iter2 b, t)

//交換兩個迭代器所指的元素

template inline typename iterator_traits::value_type //利用內嵌型別獲取返回值的型別

iter_swap(iter1 a, iter2 b)

int main()

{ listl;

l.push_back(3);

l.push_back(4);

cout<

STL運用的C 技術(3) 模板實參推斷

stl是c 標準庫的重要組成部分之一,它不僅是乙個可復用的元件庫,更是乙個包含演算法與資料結構的軟體框架,同時也是c 泛型程式設計的很好例子。stl中運用了許多c 的高階技術。本文介紹模板實參推斷的運用。主要參考了 c primer 和 stl原始碼剖析 stl利用模板模板實現的,比如它的演算法都是...

STL運用的C 技術(2) 模板特化

stl是c 標準庫的重要組成部分之一,它不僅是乙個可復用的元件庫,更是乙個包含演算法與資料結構的軟體框架,同時也是c 泛型程式設計的很好例子。stl中運用了許多c 的高階技術。本文介紹模板特化技術的運用。主要參考了 c primer 和 stl原始碼剖析 stl中大量運用了模組,可以說模板是建立類或...

C 模板實參中的引數可以省略的情況分析

先來看一道c 二級真題 未來教育解析 關於在呼叫模板函式時模板實參的使用,下列表述中正確的是 a 對於虛擬型別引數所對應的模板實參,如果能從模板函式的實參中獲得相同的資訊,則都可以省略 b 對於虛擬型別引數所對應的模板實參,如果它們是參數列中的最後的若干個引數,則都可以省略 c 對於虛擬型別引數所對...