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

std::conditional用法

std::conditional从C++11开始支持,其使用方法如下:

​ template< bool B, class T, class F > struct conditional;

将根据B的值来判断来提供数据类型,若B为true,则提供数据类型为T,反之则提供数据类型为F,例:

#include <iostream> #include <type_traits> #include <typeinfo> int main() { typedef std::conditional<true, int, double>::type Type1; typedef std::conditional<false, int, double>::type Type2; typedef std::conditional<sizeof(int) >= sizeof(double), int, double>::type Type3; std::cout << typeid(Type1).name() << '\n'; std::cout << typeid(Type2).name() << '\n'; std::cout << typeid(Type3).name() << '\n'; }

输出结果为:

int double double

用法

1. 模板参数推导,选择成员 / 返回类型

template<typename T> auto get_value(T t) -> std::conditional_t<std::is_pointer_v<T>, T*, T> { if constexpr(std::is_pointer_v<T>) return &t; else return t; }

2. 容器 / 底层存储类型选择

template<long MaxVal> using SelectIntType = std::conditional_t< MaxVal <= 32767, short, std::conditional_t<MaxVal <= 2147483647, int, long long> >; using T1 = SelectIntType<1000>; // short using T2 = SelectIntType<100000>; // int using T3 = SelectIntType<3e10>; // long long

3. 条件添加 const /volatile/ 引用修饰

// 如果布尔为true就变成const T,否则T template<bool IsConst, typename T> using CondConst = std::conditional_t<IsConst, const T, T>; CondConst<true, int> // const int CondConst<false, int> // int

4. 配合 std::enable_if,做重载的类型选择

template<typename T> struct Wrapper { // 整数用int存储,浮点用double存储 using storage_type = std::conditional_t<std::is_integral_v<T>, int, double>; storage_type data; };

5. 对齐、内存布局,条件选择对齐类型

// 是否启用simd:true用__m128,否则用float[4] template<bool UseSimd> using Vec4 = std::conditional_t<UseSimd, __m128, float[4]>;

6. 元编程分支,类型列表、递归元编程

在模板元编程循环中,做终止条件判断。

// 元编程:取第N个类型(极简示意) template<int N, typename...Args> struct NthType; template<int N, typename Head, typename...Tail> struct NthType<N,Head,Tail...> { using type = typename std::conditional_t< N == 0, std::type_identity<Head>, NthType<N-1, Tail...> >::type; };

这里通过原编程,从参数包Args...取出第N个类型,作用:类型包装器,把 T 包一层壳,内部别名::type还原成 T。

type_identity<int>::type → int type_identity_t<double> → double

这里说明,std::type_identity是在C++20 引入,头文件<type_traits>,

7. 两边类型都会实例化,不会短路

// 即使条件false,false分支的类型依然会实例化,直接编译报错 using Bad = std::conditional_t<false, typename T::no_such_type, int>;

解决:用std::type_identity惰性包装,推迟实例化。

template<bool Cond,typename T,typename U> using lazy_cond_t = typename std::conditional_t<Cond,std::type_identity<T>,std::type_identity<U>>::type;
http://www.jsqmd.com/news/1347550/

相关文章:

  • 透明度与十六进制转换全解析:从RGBA原理到跨平台应用实践
  • PDF补丁丁:免费高效的PDF工具箱终极使用指南
  • BiliTools终极指南:如何高效管理你的B站离线资源库
  • 5分钟搭建私有化微信公众号RSS服务:终极配置与优化指南
  • 从World‘s End Girlfriend《Resistance The Blessing》拆解音乐创作中的动态对比与音色拼贴
  • 三步解锁智慧教育平台电子课本离线使用的终极方案
  • 认知统一场论UCFT:四维分形认知流形下四场耦合对思维‑意义‑价值的数学统一
  • 2026年合肥市电大中专怎么报名? - cc江江
  • Chisel实战:FPGA上实现带CRC校验的UART通信模块
  • C盘满了怎么办
  • 2026年烘焙专用黄油公司选哪家 推荐法蒂斯乳制品 - 奔跑123
  • 黄梅天退散!解锁三伏天的排湿排寒秘籍 - 生活动态圈
  • 用Codex和Obsidian搭个人知识库,让AI Agent整理你的视频播客
  • FastAPI 响应格式类型全解析:从 JSON 到流式文件
  • 深度解析高效磁力转种子工具:专业转换实战指南与核心原理
  • 动态规划原理与LeetCode题解
  • Buzz音频转录工具终极指南:如何在本地高效完成语音转文字
  • 外贸 ERP 软件哪个实用?B2B 外贸与工贸一体选型全指南 - 奔跑123
  • Changedetection.io 技术深度解析:构建企业级网页变更检测系统的架构设计与实践
  • 3分钟掌握纯真IP库:快速查询IP地址的终极解决方案
  • Lano Visualizer:如何将你的桌面变成动态音乐艺术墙?
  • 别急着上Hermes,先把成本、边界和失败兜底算清楚
  • 个人护理穿戴类硅胶用抗菌防霉剂源头厂家哪家靠谱?天诗蓝盾专业解决方案全解析 - 米諾
  • Microsoft OfficeWPS
  • 蒸汽求职怎么样?为什么有人只需短期支持,有人需要长期陪跑
  • 如何快速备份QQ空间:GetQzonehistory完整数据保护终极指南
  • 《SQL 复杂查询优化数据提取 线上高并发排障实战》
  • C++11介绍之enum类型
  • 终极消息防撤回指南:3分钟掌握微信QQ消息永久留存技巧
  • Scalastyle高级技巧:如何编写自定义代码检查器提升团队效率