Effective C++ 条款47
本節(jié)條款的題目:請使用trait classes來表示類型信息
本節(jié)條款主要講述的技術是怎樣在編譯期間實現對迭代器類型的推斷,依據推斷的類型進行最優(yōu)處理。
我們先來看一下迭代器的種類:
1.input_iterator:僅僅讀,僅僅能逐個前移
2.output_iterator:僅僅寫,僅僅能逐個前移
3.forward_iterator:可讀可寫,僅僅能逐個前移
4.bidirectional_iterator:可讀可寫,支持逐個前移和后移
5.random_access_iterator:可讀可寫,支持隨機訪問(隨意步數移動)
假設一下,假設有一個函數用于對迭代器指定移動次數d,我們怎樣實現這個函數,以達到最理想的狀態(tài)。
我們肯定會處理迭代器是random access類型的情況和不是random access類型的情況。當時random access的時候,直接加減迭代器在常數時間內完畢,假設不是,僅僅能一步一步向前或向后移動。
例如以下代碼:
但是,我們怎么才干做到“iter is a random access iterator”在編譯期間的實現?
實現這個功能。須要下面幾步,而且相對繁雜的幾步。
首先為每一種迭代器設置struct標簽,每一個struct都是空的結構體,例如以下代碼:
struct input_iterator_tag{};struct output_iterator_tag{};struct forward_iterator_tag: public input_iterator_tag{};struct bidirectional_iterator: public forward_iterator_tag{};struct random_access_iterator: public bidirectional_iterator_tag{};接著。我們就要引入traits,traits是一種技術,我們通過程序來看一下這是什么技術。有什么用。
我們來看一下關于各種容器的定義:
從上面代碼能夠看出,每一個容器中都有一個iterator類。但是每一個iterator類中的迭代器標簽卻不一樣。
當我們調用語句vector<int>::iterator::iterator_category時會返回random_access_iterator類的類型,當我們調用list<int>::iterator::iterator_category時會返回bidirectional_iterator類的類型。
我們再來看一下有關iterator_traits結構體的定義,
假設我們通過語句iterator_traits<vector<int>::iterator>::iterator_category調用就會返回有關vector<int>迭代器iterator的類型,該語句返回random_access_iterator類型。
同理iterator_traits<list<int>::iterator>::it
總結
以上是生活随笔為你收集整理的Effective C++ 条款47的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 性能监测:Memory
- 下一篇: 《Windows Server 2012