为泛型函数定义自定义迭代器特征
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正在发挥作用,用于高级工作。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 如何将 stl 迭代器与特征一起使用?
- 特征 使用 SIMD 迭代稀疏矩阵中的内部迭代器
- 寻找Boost转换迭代器的复合特征模式
- C :多态容器 /迭代器与编译时间概念 /特征
- c++反向迭代器和特征
- 使用类型特征为字符串迭代器专门化模板函数
- 传递std::迭代器,指向具有特征类型的向量
- 为泛型函数定义自定义迭代器特征