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

2021-07-12 05:36:35 字數 2722 閱讀 7171

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

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

[cpp]view plain

copy

print?

//較小值

template

<

class

t>  

inline

const

t& min(

const

t& a, 

const

t& b)   

//較大值

template

<

class

t>  

inline

const

t& max(

const

t& a, 

const

t& b)   

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

[cpp]view plain

copy

print?

intmain()    

[cpp]view plain

copy

print?

inline

const

int& min(

const

int& a, 

const

int& b)   

inline

const

double

& min(

const

double

& a, 

const

double

& b)   

[cpp]view plain

copy

print?

//真正的交換函式  

template

<

class

iter1, 

class

iter2, 

class

t>    

inline

void

_iter_swap(iter1 a, iter2 b, t)     

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

template

<

class

iter1, 

class

iter2>    

inline

void

iter_swap(iter1 a, iter2 b)    

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

[cpp]view plain

copy

print?

#include 

#include 

#include 

using

namespace

std;  

//萃取劑

template

<

class

i>  

struct

iterator_traits;  

//特化 原生指標

template

<

class

t>  

struct

iterator_traits;  

//特化 原生常指標

template

<

class

t>  

struct

iterator_traits<

const

t*>;  

//真正的交換函式  

template

<

class

iter1, 

class

iter2, 

class

t>    

inline

void

_iter_swap(iter1 a, iter2 b, t)     

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

template

<

class

iter1, 

class

iter2>    

inline

typename

iterator_traits::value_type 

//利用內嵌型別獲取返回值的型別

iter_swap(iter1 a, iter2 b)     

intmain()    

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 對於虛擬型別引數所對...