template <typename T>
class MyIterator {
using value_type = T; // 內嵌類型
// ...
};
自定義迭代器可定義 value_type,但**原生指針 int* 無法添加內嵌類型**。泛型算法 Foo(Iterator) 需統一接口獲取元素類型。
// 主模板:假設類型有內嵌 value_type
template <typename T>
struct IteratorTraits {
using value_type = typename T::value_type;
};
算法改為:
template <typename Iter>
typename IteratorTraits<Iter>::value_type Foo(Iter it) { /* ... */ }
// 偏特化:T* 類型
template <typename T>
struct IteratorTraits<T*> {
using value_type = T;
};
// 進一步支持 const 指針
template <typename T>
struct IteratorTraits<const T*> {
using value_type = T;
};
現可直接用原生指針:
int arr[] = {1,2,3};
int* p = arr;
int val = Foo(p); // IteratorTraits<int*>::value_type 為 int
<iterator> 中的 std::iterator_traits標準庫已完善定義,提取 5 種關鍵類型:
value_type:元素類型;difference_type:距離類型;pointer、reference:指針/引用類型;iterator_category:輸入/輸出/前向/雙向/隨機訪問迭代器標籤。算法據此選擇最優實現(如 std::advance 對隨機訪問迭代器 O(1),其他 O(n))。
C++11 <type_traits> 提供大量編譯期類型查詢/轉換:
std::is_integral<T>::value
std::remove_reference<T>::type
std::enable_if<cond, T>::type // SFINAE 關鍵
std::conditional<cond, T, F>::type
C++17 起引入變量模板簡寫:std::is_integral_v<T>。
template <typename T>>
struct SerializationTraits {
static constexpr bool is_supported = false;
static std::string to_string(const T&); // 未定義
};
// 為基本類型特化
template <> struct SerializationTraits<int> {
static constexpr bool is_supported = true;
static std::string to_string(int v) { return std::to_string(v); }
};
// 泛型序列化函數
template <typename T>
std::enable_if_t
serialize(const T& v) {
return SerializationTraits<T>::to_string(v);
}
Traits 是 C++ 泛型編程的**類型擦除與特化橋樑**。它將「類型擁有的信息」外部化、標準化,使算法能統一處理用戶類型與內置類型。掌握 iterator_traits、type_traits 及自定義 Traits 設計,是編寫高質量泛型庫的核心技能。