1. convert_pointer
结构体模板
template<typename _SourceIterator, typename _DestT>
struct convert_pointer {
typedef typename convert_pointer<typename _SourceIterator::pointer, _DestT>::type type;
};
作用
- 这是一个递归模板,用于处理
_SourceIterator
类型的迭代器指针转换。 - 它假设
_SourceIterator
具有pointer
类型(通常是迭代器的value_type*
)。 - 递归调用
convert_pointer<typename _SourceIterator::pointer, _DestT>
,直到_SourceIterator
变为普通指针类型(即_SourceT*
)。 - 适用于 STL 迭代器或自定义迭代器,确保能正确转换指向
_DestT
的指针。
2. convert_pointer
的特化
定义两种对普通指针类型的特化处理。
(1)普通指针转换
template<typename _SourceT, typename _DestT>
struct convert_pointer<_SourceT*, _DestT> {
typedef _DestT* type;
};
- 如果
_SourceIterator
是_SourceT*
,那么转换后的类型是_DestT*
。 - 示例:
convert_pointer<int*, float>::type // 结果是 float*
(2)const
指针转换
template<typename _SourceT, typename _DestT>
struct convert_pointer<const _SourceT*, _DestT> {
typedef const _DestT* type;
};
- 如果
_SourceIterator
是const _SourceT*
,则转换后的指针仍然保持const
修饰符,即const _DestT*
。 - 示例:
convert_pointer<const int*, float>::type // 结果是 const float*
3. convert_pointer_t
别名
template<typename _SourceIterator, typename _DestT>
using convert_pointer_t = typename convert_pointer<_SourceIterator, _DestT>::type;
- 这是
convert_pointer
的类型别名(alias template),简化了类型使用方式。 - 示例:
convert_pointer_t<const int*, double> // 结果是 const double*
4. 代码应用场景
在泛型指针转换时,特别适用于 STL 迭代器或自定义迭代器:
- 支持普通指针与
const
指针的转换 - 用于 STL 迭代器,确保指向
value_type*
的指针能正确转换 - 减少
const
处理的复杂度,增强泛型编程的灵活性
5. 示例代码
#include <iostream>
#include <vector>
int main() {
using Pointer1 = convert_pointer_t<int*, double>;
using Pointer2 = convert_pointer_t<const int*, double>;
std::cout << std::boolalpha;
std::cout << "Pointer1 is double*: " << std::is_same<Pointer1, double*>::value << "\n";
std::cout << "Pointer2 is const double*: " << std::is_same<Pointer2, const double*>::value << "\n";
return 0;
}
输出
Pointer1 is double*: true
Pointer2 is const double*: true
说明 convert_pointer_t
能正确保留 const
修饰符并转换指针类型。
总结
🔹 convert_pointer
作用:根据输入类型 _SourceIterator
的 const
修饰符,生成新的 _DestT
指针类型。
🔹 采用 递归模板,支持 STL 迭代器类型的转换。
🔹 适用于泛型编程,保证指针转换时不会丢失 const
修饰符。
🔹 提供 convert_pointer_t
简化模板使用。