繁体   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