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