泛型程式設計 旨在產出可重用軟體組件。C++ 模板是其核心工具,Boost 庫將其發揮到極致。本文系統解析 Boost 採用的六大核心技術:概念、Traits、標記分派、適配器、型別生成器、物件生成器、策略類。
以 memcpy 為例,C 版本用 void* 處理陣列;C++ STL 抽象出「輸入/輸出迭代器」概念,寫出通用 copy:
template
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result) {
while (first != last) *result++ = *first++;
return result;
}
支援 vector、list、陣列、任何滿足迭代器概念的型別。
| 構成要素 | 說明 | 範例 |
|---|---|---|
| 有效表達式 | 代入樣本型別必能編譯通過 | ++it, *it, it1 == it2 |
| 相關型別 | 與樣本共同出現於表達式 | value_type, difference_type |
| 不變條件 | 執行期必須為真 | 迭代器遞增後不等於原值 |
| 複雜度保證 | 時間/空間上界 | 隨機存取迭代器 it + n O(1) |
概念細化:ForwardIterator 細化 InputIterator,增加多遍歷保證。
template
struct iterator_traits {
typedef ... iterator_category; // 分類:input/forward/bidirectional/random_access
typedef ... value_type; // 元素型別
typedef ... difference_type; // 距離型別
typedef ... pointer;
typedef ... reference;
};
iterator_traits 為指標提供特化iterator_category 選擇最優實作 (如 advance)
// 標記型別
struct input_iterator_tag {};
struct bidirectional_iterator_tag {};
struct random_access_iterator_tag {};
// 重載分派函數
template
void advance_dispatch(InputIterator& i, Distance n, input_iterator_tag) {
while (n--) ++i;
}
template
void advance_dispatch(BidirectionalIterator& i, Distance n, bidirectional_iterator_tag) {
if (n >= 0) while (n--) ++i; else while (n++) --i;
}
template
void advance_dispatch(RandomAccessIterator& i, Distance n, random_access_iterator_tag) {
i += n; // O(1)
}
// 總攬函數
template
void advance(InputIterator& i, Distance n) {
typename iterator_traits::iterator_category category;
advance_dispatch(i, n, category); // 編譯期依 category 選擇重載
}
核心:iterator_traits 提取標記 → 函數重載解析分派 → 編譯期零開銷多態。
reverse_iterator:反轉遞增/遞減行為stack:適配容器提供堆疊介面以 boost::filter_iterator_generator 為例:
template
struct filter_iterator_generator {
typedef iterator_adaptor<
Iterator, filter_iterator_policies,
Value, Reference, Pointer, Category, Distance> type;
};
使用者只需寫:boost::filter_iterator_generator。
因 C++ 缺乏模板化 typedef,型別生成器作為替代方案。
make_*:std::make_pair, boost::make_sharedbind2nd(mem_fun(&Widget::tweak), arg) vs 完整型別
template >
class vector { ... }; // Allocator 為策略類
std::char_traits 即策略類 (決定 basic_string 行為)Boost 確立了現代 C++ 泛型程式設計的工程化範式:概念定義契約 → Traits 提取特性 → 標記分派靜態多態 → 適配器/生成器簡化使用 → 策略類參數化行為。這套技術體系不僅支撐了 Boost/STL,更深刻影響了 C++ 標準演進 (C++11/14/17/20 概念、Ranges、自定義化配置器等)。