iT邦幫忙

2025 iThome 鐵人賽

DAY 21
2
Software Development

30 天 Effective C++ 大挑戰!!系列 第 21

[Day 21] Templates and Generic Programming IV

  • 分享至 

  • xImage
  •  

終於到了 Templates and Generic Programming 的尾聲。這個章節包含許多重要觀念,需要停下腳步用心思考。明天又是小測驗時間,跟著 Yoyo 一起檢核吸收程度吧!

47. Use traits classes for information about types

在撰寫泛型函式時,需根據迭代器類型執行不同的操作。而 C++ STL 定義了五種迭代器類別,各自支援不同的操作。

  • Input Iterators:只能向前移動,且每次移動只能一步。只能讀取其所指向的內容,且每個位置的內容只能讀取一次。 e.g. istream_iterator
  • Output Iterators:與輸入迭代器類似,但用途在於寫入資料。 e.g. ostream_iterator
  • Forward Iterators:包含輸入迭代器和輸出迭代器的功能,並可多次讀取或寫入相同位置的內容。 e.g. unordered_map
  • Bidirectional Iterators:除了前向迭代器的功能外,還可向後移動。 e.g. maplistset
  • Random Access Iterators:增加了迭代器算術運算能力,能在常數時間內向前或向後跳轉任意距離。 e.g. vectorstringdeque

Traits 是一種 C++ 程式設計技巧,透過 typedef 在類別中添加型別資訊,在編譯時取得型別資訊。

template<typename IterT>
struct iterator_traits {
    typedef typename IterT::iterator_category iterator_category;
};

當迭代器類型是內建指標時,需進行模板特化以支持指標所屬的 random access iterator 類型:

template<typename IterT>
struct iterator_traits<IterT*> {
    typedef random_access_iterator_tag iterator_category;
};

48. Be aware of template metaprogramming

模板元程式設計是一種基於模板的 C++ 編程技術,它允許程式在編譯時期執行。通過模板的遞迴實例化或特化等機制,生成完整的 C++ 原始碼,並經由編譯器進行常規的編譯過程最終轉化成執行檔。

TMP 的兩大特點:

  • 可以簡化難以在 C++ 中完成的操作。 e.g. 支持遞迴模板定義
  • 將運行時負擔轉移為編譯時操作,提高效率。
template<unsigned n>
struct Factorial {
    enum { value = n * Factorial<n-1>::value };
};
template<>
struct Factorial<0> {
    enum { value = 1 };
};

TMP 的常見應用如下,在 HFT 等需要數學計算的領域有巨大的價值:

  • 確保單位換算的正確性。
  • 對矩陣操作進行優化。
  • 動態生成特定的設計模式。

上一篇
[Day 20] Templates and Generic Programming III
下一篇
[Day 22] 中場休息 Q&A小測驗!!
系列文
30 天 Effective C++ 大挑戰!!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言