当前位置: 首页 > news >正文

一个模板元编程示例

代码

#include <iostream>
#include <type_traits>// 基础模板定义
template <bool AddOrRemoveRef> struct Fun_;// 偏特化:添加左值引用
template <>
struct Fun_<true>{template <typename T>using type = typename std::add_lvalue_reference<T>::type;
};// 偏特化:移除引用
template <>
struct Fun_<false> {template<typename T>using type = typename std::remove_reference<T>::type;
};// 正确的模板别名定义
template <bool AddOrRemove, typename T>
using Fun = typename Fun_<AddOrRemove>::template type<T>;// 正确的Res_定义
template <typename T>
using Res_ = Fun<false, T>;int main() {// 测试Res_<int&> h = 3;  // h的类型是intstd::cout << h << std::endl;return 0;
}

这段代码展示了使用模板元编程技术实现的条件类型转换,根据布尔值参数决定添加左值引用或移除引用。下面逐步解析其工作原理:

1. 基础模板声明

template <bool AddOrRemoveRef> struct Fun_;
  • 声明主模板Fun_,接受一个布尔值非类型参数AddOrRemoveRef

  • 作用:作为分发开关,根据布尔值选择不同特化版本

2. 特化版本实现

(1) true 特化:添加左值引用
template <>
struct Fun_<true> {template <typename T>using type = typename std::add_lvalue_reference<T>::type;
};
  • AddOrRemoveRef=true时激活

  • 使用std::add_lvalue_reference将任意类型T转换为左值引用类型T&

  • 示例:int → int&

(2) false 特化:移除引用
template <>
struct Fun_<false> {template<typename T>using type = typename std::remove_reference<T>::type;
};
  • AddOrRemoveRef=false时激活

  • 使用std::remove_reference移除类型的所有引用修饰

  • 示例:int& → intint&& → int

3. 统一接口封装

template <bool AddOrRemove, typename T>
using Fun = typename Fun_<AddOrRemove>::template type<T>;
  • 创建别名模板Fun简化调用

  • 关键语法

    • typename:指明Fun_<AddOrRemove>::type是依赖类型名

    • template:指明type是依赖模板名

  • 调用方式:Fun<flag, T> 根据flag选择转换操作

4. 特定功能封装

template <typename T>
using Res_ = Fun<false, T>;
  • 固定false参数的便捷别名

  • 专用功能:移除任何传入类型的引用

  • 等价于:Res_<T> = std::remove_reference_t<T>

5. 测试代码分析

Res_<int&> h = 3;  // 等价于 int h = 3
  1. Res_<int&> 实例化过程:

    • 通过Res_调用Fun<false, int&>

    • 激活Fun_<false>::type<int&>

    • 执行std::remove_reference<int&>::type → int

  2. 变量h实际类型为int

  3. 赋值3符合整型要求

设计模式总结

组件作用示例输入→输出
Fun_<true>添加左值引用int → int&
Fun_<false>移除所有引用const int& → const int
Res_专用移除引用工具double&& → double

关键语法解析

using Fun = typename Fun_<B>::template type<T>;
// 1. typename   → 声明后面是类型(依赖名称解析)
// 2. template   → 表明type是模板(防止编译器误解析)
// 3. ::type     → 访问嵌套类型

典型应用场景

  1. 通用类型处理框架中条件转换

  2. 元函数转发时减少::type重复书写

  3. 构建复杂类型运算的中间层

这种设计模式在标准库元编程中常见(如std::conditional的实现),通过布尔开关分发处理逻辑,提高模板代码的复用性和可读性。

相关文章:

  • 亚马逊Woot秒杀:引爆销量
  • Day 48
  • c++动态规划4——环形动态规划
  • 岛屿周长问题的三种解法:直接计数法、数学计算法与深度优先搜索
  • redis-7.4.4使用
  • 论索引影响性能的一面④ 索引失踪之谜【上】
  • 学习日记-day29-6.13
  • python+django/flask成都奥科厨具厂产品在线销售系统
  • Python学习(9) ----- Python的Flask
  • bytes转string
  • icg真的只能用latch不能用Flip-flop吗
  • 洛谷自己创建的一个小比赛【c++】
  • PCB设计教程【大师篇】stm32开发板PCB整体布局
  • Android13 新增 Stable AIDL接口
  • 传染病传播模拟:基于社会接触网络的疫情预测模型
  • django restframework 在serializer里 通过context设置session
  • 在ros中动态调整雷达,线激光雷达等设备的静态坐标关系
  • 【Python教程】CentOS系统下Miniconda3安装与Python项目后台运行全攻略
  • Spring XML 常用命名空间配置
  • C语言预处理命令详解
  • 如何把做的网站与域名连接/三一crm手机客户端下载
  • 北京网站建设公司代理/搜索引擎排名优化程序
  • 网站开发应该怎么做/网络营销的策划流程
  • 深圳福田做网站/开发一个app平台大概需要多少钱?
  • 越秀区营销型网站建设/谷歌seo技巧
  • 衢州网站建设找哪家/哪里有学电脑培训班