簡體   English   中英

為泛型函數定義自定義迭代器特征

[英]Defining a custom iterator traits for a generic function

我正在嘗試編寫一個泛型函數,該函數將根據給定的迭代器在編譯時派生返回類型。 通常,這是通過std :: iterator_traits完成的,但是我也想定義自己的iterator_traits版本,稱為my_iterator traits。 這是我的代碼:

#include <cassert>
#include <iterator>
#include <vector>

using namespace std;

template <typename I>
struct my_iterator_traits {
    typedef typename I::value_type                     value_type;
    typedef typename I::iterator_category       iterator_category;
};

template <typename T>
struct my_iterator_traits<T*> {
    typedef T                                         value_type;
    typedef std::random_access_iterator_tag    iterator_category;
};                                                               

template <typename II>
typename my_iterator_traits<II>::value_type f(II b, II e) {
    typename my_iterator_traits<II>::value_type val = 0;
    return val;
}

int main () {
    int a[] = {2, 3, 4};
    int i = f(a, a + 3);

    assert(i == 0);

    // vector<int> v = {2};
    // f(v.begin(), v.end());

    // assert(j == 0);
    return 0;
}

包括main函數和函數f()在內的所有內容都是很合理的。 在main中,我創建一個int數組,對其調用f() ,並確認我得到的輸出是一個值為0的int。

尚不清楚的是以下內容。 我有兩個模板,其次是struct關鍵字。 最好使用第二個參數(以T*作為模板參數的參數)。 具體來說,為什么我們需要第一個結構模板(一個沒有模板參數的結構模板)? 更重要的是,兩個結構模板之間是什么關系?

一個是模板的聲明, 第二個是第一個的部分專業化 像鏈接中所述的部分專業化可以對模板參數進行自定義(例如:一些固定參數,對您要引用的參數(指針,引用等)的某些限制等)。

第一個template<typename>struct是一個template ,第二個是第一個template

template類似於基於模式匹配的覆蓋(但不是真的)。 如果template的參數可以通過專業化模式進行匹配,則使用它代替。

這種模式匹配不會像函數重寫那樣進行類型轉換。 SFINAE正在為高級工作而努力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM