C++模板递归结构详解和使用

示例代码

template<typename _SourceIterator, typename _DestT>
struct convert_pointer {
    
    
    typedef typename convert_pointer<typename _SourceIterator::pointer, _DestT>::type type;
};
1. 模板参数
  • _SourceIterator 是输入的类型,通常表示迭代器类型。
  • _DestT 是目标类型,表示希望转换成的目标类型。
2. typename _SourceIterator::pointer
  • _SourceIterator 是一个迭代器类型,因此它应该定义一个 pointer 类型成员,这个成员通常是迭代器所指向的元素类型的指针类型。例如,如果 SourceIterator 是一个 std::vector<int>::iterator,那么 pointer 类型通常就是 int*

    这一行的作用是:递归地取出 _SourceIterator 类型的 pointer 类型成员,也就是提取出迭代器所指向的元素类型的指针类型,并将它作为新的类型传递给下一个模板递归调用。

3. 递归调用
  • convert_pointer<typename _SourceIterator::pointer, _DestT> 是递归调用。递归的核心思想是:每次将 _SourceIterator 类型中的 pointer 类型作为新的 _SourceIterator 进行递归,直到递归的类型达到指针类型(如 int*const double*)。

    递归最终会降到普通的指针类型,然后我们在其他模板特化中处理它。

4. typedef typename ... ::type
  • 递归调用返回的是 convert_pointer 模板的 type 类型成员。每次递归会将当前递归层次的结果传递到上一级。

    最终会得到 _SourceIterator_DestT 类型的转换结果,并通过 typedef 定义为 type

实现过程的示例

  1. 基本的迭代器指针类型转换

假设我们有一个迭代器 std::vector<int>::iterator,我们希望将其转换为 double* 类型。为了进行这个转换,递归步骤的过程如下:

第一层递归:
convert_pointer<std::vector<int>::iterator, double>
  • 这里 _SourceIteratorstd::vector<int>::iterator_DestTdouble
  • 我们首先查找 std::vector<int>::iteratorpointer 类型,结果为 int*,然后调用 convert_pointer<int*, double>
第二层递归:
convert_pointer<int*, double>
  • 这里 _SourceIteratorint*_DestTdouble

  • 由于 int* 是一个普通指针,不是迭代器,所以最终会匹配到 convert_pointer<int*, double> 的特化版本,即:

    template<typename _SourceT, typename _DestT>
    struct convert_pointer<_SourceT *, _DestT> {
          
          
        typedef _DestT *type;
    };
    
  • 在这里,type 会被定义为 double*,即我们得到了目标类型。

递归结束
  • 最终返回 double* 作为 type,这就是我们期望的结果。

总结

convert_pointer 这个模板结构体通过递归调用的方式,逐层处理类型转换。它首先从迭代器的 pointer 类型开始递归,一直到普通指针类型,并在递归的最终层根据目标类型生成最终的指针类型。

  • 第一层递归:提取迭代器的 pointer 类型。
  • 递归最终层:最终匹配普通指针类型并进行转换。

这种递归的方式使得 convert_pointer 可以处理复杂的类型结构,并通过多次递归最终转换为我们需要的目标类型。