news 2026/9/3 4:14:52

有意思的新特性:void_t

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
有意思的新特性:void_t

博主介绍:程序喵大人

  • 35 - 资深C/C++/Rust/Android/iOS客户端开发
  • 10年大厂工作经验
  • 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
  • 《C++20高级编程》《C++23高级编程》等多本书籍著译者
  • 更多原创精品文章,首发gzh,见文末
  • 👇👇记得订阅专栏,以防走丢👇👇
    😉C++基础系列专栏
    😃C语言基础系列专栏
    🤣C++大佬养成攻略专栏
    🤓C++训练营
    👉🏻个人网站

C++ void_t 特性详解与典型用法示例

最近发现了一个有意思的特性:void_t。void_t是C++17引入的一个新特性,它的定义很简单(有些编译器的实现可能不是这样,但也大体类似):

template<class...>usingvoid_t=void;

看着它很简单,但它搭配SFINAE却可以在模板元编程中发挥巨大作用。

比如在编译期判断类是否有某个类型using:

template<class,class=std::void_t<>>structhas_type:std::false_type{};template<classT>structhas_type<T,std::void_t<typenameT::type>>:std::true_type{};

比如判断是否有某个成员:

template<class,class=std::void_t<>>structhas_a_member:std::false_type{};template<classT>structhas_a_member<T,std::void_t<decltype(std::declval<T>().a)>>:std::true_type{};

比如判断某个类是否可迭代:

template<typename,typename=void>constexprboolis_iterable{};template<typenameT>constexprboolis_iterable<T,std::void_t<decltype(std::declval<T>().begin()),decltype(std::declval<T>().end())>>=true;

比如判断某个类是否有某个函数:

template<classT,class=void>structhas_hello_func:std::false_type{};template<classT>structhas_hello_func<T,std::void_t<decltype(std::declval<T>().hello())>>:std::true_type{};

测试结果:

structHasType{typedefinttype;};structNHasType{inthello;};structHasa{inta;};structNHasa{intb;};structHasHello{voidhello();};structNoHasHello{};intmain(){std::cout<<has_type<HasType>::value<<'\n';// 1std::cout<<has_type<NHasType>::value<<'\n';// 0std::cout<<has_a_member<Hasa>::value<<'\n';// 1std::cout<<has_a_member<NHasa>::value<<'\n';// 0std::cout<<has_hello_func<HasHello>::value<<'\n';// 1std::cout<<has_hello_func<NoHasHello>::value<<'\n';// 0std::cout<<is_iterable<std::vector<double>><<'\n';// 1std::cout<<is_iterable<double><<'\n';// 0}

它的原理其实就是利用SFINAE和模板优先找特化去匹配的特性,估计大家应该看示例代码就能明白。

码字不易,欢迎大家点赞,关注,评论,谢谢!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 23:40:42

零基础实战:完成一个LED灯阵列的PCB布线项目

从点亮第一颗LED开始&#xff1a;手把手带你完成人生第一个PCB设计你有没有过这样的经历&#xff1f;看着别人做的智能灯带、像素屏、动画面板&#xff0c;心里直痒痒&#xff0c;却总觉得“PCB设计”四个字高深莫测&#xff0c;像是只有科班出身的工程师才能碰的领域&#xff…

作者头像 李华
网站建设 2026/9/2 23:41:57

Anthropic 收购 Bun:当 AI 巨头决定掌控底层代码基建

硅谷的 AI 竞赛已经进入 next level 了&#xff0c;原本卷模型参数&#xff0c;现在开始卷应用生态和底层基建。 当地时间 12 月 2 日&#xff0c;Anthropic 宣布收购热门 JavaScript 运行时工具 Bun。这并非一次简单的人才收购&#xff08;Acqui-hire&#xff09;&#xff0c…

作者头像 李华
网站建设 2026/9/2 23:40:52

FPGA中时序逻辑电路构建的操作指南

FPGA时序逻辑设计实战&#xff1a;从触发器到跨时钟域的系统构建 你有没有遇到过这样的情况&#xff1f;代码写得严丝合缝&#xff0c;仿真波形完美无瑕&#xff0c;结果下载到FPGA板子上一跑&#xff0c;数据错乱、状态跳变异常&#xff0c;甚至直接“死机”&#xff1f;别急—…

作者头像 李华
网站建设 2026/9/3 0:55:21

Proteus蜂鸣器电路常见问题及解决方案全面讲解

Proteus蜂鸣器仿真不响&#xff1f;别急&#xff0c;这才是你该掌握的实战调试指南最近带学生做单片机课程设计&#xff0c;好几个同学跑来问我&#xff1a;“老师&#xff0c;我电路连得没错&#xff0c;程序也烧进去了&#xff0c;怎么Proteus里的蜂鸣器就是不‘嘀’一声&…

作者头像 李华
网站建设 2026/9/2 23:13:35

[Web自动化] CSS选择器与样式规则

4.2 CSS选择器与样式规则 在CSS中&#xff0c;选择器是核心概念之一&#xff0c;它决定了哪些HTML元素会被应用样式规则。本章将详细介绍CSS的选择器以及样式规则的构成&#xff0c;并通过实例加深理解。 4.2.1 选择器进阶 除了第一章介绍的基础选择器外&#xff0c;CSS还提…

作者头像 李华
网站建设 2026/9/3 0:05:09

事件时间线梳理:从多个文档中还原发展脉络

从零构建企业级AI知识中枢&#xff1a;基于Anything-LLM的RAG实践 在当今信息爆炸的时代&#xff0c;企业每天都在产生大量非结构化文档——合同、报告、会议纪要、产品手册。这些“沉睡的知识”往往散落在员工的邮箱、网盘和本地硬盘中&#xff0c;查找效率低、更新不同步、权…

作者头像 李华