C traits技術的理解

2021-07-14 13:32:41 字數 1606 閱讀 2884

traits是c++中的自動型別推斷,可以用來獲得乙個型別的相關資訊。比如我們有乙個泛型的迭代器類,其中t為所指向的型別。

template class myiterator

;

當我們使用myiterator時,怎樣才能獲知它所指向的元素的型別呢?我們可以為這個類加入乙個內嵌型別,像這樣:

template class myiterator

;

這樣當我們使用myiterator型別時,可以通過 myiterator::value_type來獲得相應的myiterator所指向的型別。

現在我們來設計乙個演算法,使用這個資訊。

template typename myiterator::value_type foo(myiteratori)

這裡我們定義了乙個函式foo,它的返回為為  引數i 所指向的型別,也就是t,那麼我們為什麼還要興師動眾的使用那個value_type呢? 那是因為,當我們希望修改foo函式,使它能夠適應所有型別的迭代器時,我們可以這樣寫:

template //這裡的i可以是任意型別的迭代器

typename i::value_type foo(i i)

現在,任意定義了 value_type內嵌型別的迭代器都可以做為foo的引數了,並且foo的返回值的型別將與相應迭代器所指的元素的型別一致。至此一切問題似乎都已解決,我們並沒有使用任何特殊的技術。然而當考慮到以下情況時,新的問題便顯現出來了:

原生指標也完全可以做為迭代器來使用,然而我們顯然沒有辦法為原生指標新增乙個value_type的內嵌型別,如此一來我們的foo()函式就不能適用原生指標了,這不能不說是一大缺憾。那麼有什麼辦法可以解決這個問題呢? 此時便是我們的主角:型別資訊榨取機 traits 登場的時候了

我們可以不直接使用myiterator的value_type,而是通過另乙個類來把這個資訊提取出來:

template class traits

;

這樣,我們可以通過 traits::value_type 來獲得myiterator的value_type,於是我們把foo函式改寫成:

template //這裡的i可以是任意型別的迭代器

typename traits::value_type foo(i i)

然而,即使這樣,那個原生指標的問題仍然沒有解決,因為trait類一樣沒辦法獲得原生指標的相關資訊。於是我們祭出c++的又一件利器--偏特化(partial specialization):

template class traits//注意 這裡針對原生指標進行了偏特化

;

通過上面這個 traits的偏特化版本,我們陳述了這樣乙個事實:乙個 t* 型別的指標所指向的元素的型別為 t。

如此一來,我們的 foo函式就完全可以適用於原生指標了。比如:

int* p;

....

inti = foo(p);

traits會自動推導出 p 所指元素的型別為 int,從而foo正確返回。

深入技術的理解

資料庫八大優化 索引,合適屬性字段,join,union,事物,鎖表,外來鍵,資料庫語句優化 c 與lua通訊 c 與lua通過堆疊通訊,c 呼叫lua,通過壓棧資料,lua取到資料進行運算,再把資料返回棧頂,c 再通過api呼叫棧頂資料。lua呼叫c c先編寫函式,再註冊到lua的直譯器裡面,lu...

OCR技術的簡單理解

一.cor應用場景 1.四類 數字原生類 商品圖是最具有代表性的數字原生類文字圖。特點 1 最複雜多樣 各種字型 背景 排列 組合等 mtwi挑戰賽 最大的ocr競賽 2 最有價值 商品資訊載體 3 量最大 千億,每日不停更新。文件類 文件類ocr需求非常廣,涉及各種公務場景。特點 1 100 識別...

各種技術的個人理解

因為單體架構在使用者多了以後是無法承受的,需要拆分,微服務就是將各個服務的效能達到最大化。為了解決引入微服務出現的幾個問題 1.客戶端在這麼多服務之間如何精確的訪問自己需要的服務?2.服務之間如何互相呼叫 3.服務之間的註冊和發現 4.服務高可用的實現1.dubbo是 rpc遠端呼叫,非同步io,服...