C++模版结构体的利用

打印 上一主题 下一主题

主题 1529|帖子 1529|积分 4587

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. convert_pointer 结构体模板

  1. template<typename _SourceIterator, typename _DestT>
  2. struct convert_pointer {
  3.     typedef typename convert_pointer<typename _SourceIterator::pointer, _DestT>::type type;
  4. };
复制代码
作用



  • 这是一个递归模板,用于处理 _SourceIterator 范例的迭代器指针转换
  • 它假设 _SourceIterator 具有 pointer 范例(通常是迭代器的 value_type*)。
  • 递归调用 convert_pointer<typename _SourceIterator::pointer, _DestT>,直到 _SourceIterator 变为平凡指针范例(即 _SourceT*)。
  • 实用于 STL 迭代器或自定义迭代器,确保能正确转换指向 _DestT 的指针。

2. convert_pointer 的特化

定义两种对平凡指针范例的特化处理。
(1)平凡指针转换

  1. template<typename _SourceT, typename _DestT>
  2. struct convert_pointer<_SourceT*, _DestT> {
  3.     typedef _DestT* type;
  4. };
复制代码


  • 假如 _SourceIterator 是 _SourceT*,那么转换后的范例是 _DestT*。
  • 示例
    1. convert_pointer<int*, float>::type  // 结果是 float*
    复制代码

(2)const 指针转换

  1. template<typename _SourceT, typename _DestT>
  2. struct convert_pointer<const _SourceT*, _DestT> {
  3.     typedef const _DestT* type;
  4. };
复制代码


  • 假如 _SourceIterator 是 const _SourceT*,则转换后的指针仍旧保持 const 修饰符,即 const _DestT*。
  • 示例
    1. convert_pointer<const int*, float>::type  // 结果是 const float*
    复制代码

3. convert_pointer_t 别名

  1. template<typename _SourceIterator, typename _DestT>
  2. using convert_pointer_t = typename convert_pointer<_SourceIterator, _DestT>::type;
复制代码


  • 这是 convert_pointer 的范例别名(alias template),简化了范例利用方式。
  • 示例
    1. convert_pointer_t<const int*, double>  // 结果是 const double*
    复制代码

4. 代码应用场景

泛型指针转换时,特别实用于 STL 迭代器或自定义迭代器:


  • 支持平凡指针与 const 指针的转换
  • 用于 STL 迭代器,确保指向 value_type* 的指针能正确转换
  • 减少 const 处理的复杂度,增强泛型编程的机动性

5. 示例代码

  1. #include <iostream>
  2. #include <vector>
  3. int main() {
  4.     using Pointer1 = convert_pointer_t<int*, double>;
  5.     using Pointer2 = convert_pointer_t<const int*, double>;
  6.     std::cout << std::boolalpha;
  7.     std::cout << "Pointer1 is double*: " << std::is_same<Pointer1, double*>::value << "\n";
  8.     std::cout << "Pointer2 is const double*: " << std::is_same<Pointer2, const double*>::value << "\n";
  9.     return 0;
  10. }
复制代码
输出

  1. Pointer1 is double*: true
  2. Pointer2 is const double*: true
复制代码
说明 convert_pointer_t 能正确保留 const 修饰符并转换指针范例。

总结

回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表