news 2026/6/23 13:40:17

有意思的新特性: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/6/19 15:13:27

Log4j 的安全盲点:TLS新漏洞可用于拦截敏感日志

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01;编译&#xff1a;代码卫士Apache软件基金会为广泛使用的日志记录库Log4j发布安全更新&#xff0c;修复了一个中危漏洞CVE-2025-68161&#xff0c;它可导致攻击者拦截传输中的敏感日志数据。该漏洞影响Log4j的 "S…

作者头像 李华
网站建设 2026/6/3 17:11:25

高速信号回流路径优化的PCB设计通俗解释

让高速信号“回家”的路畅通无阻&#xff1a;PCB回流路径设计实战解析你有没有遇到过这样的情况&#xff1f;电路原理图明明画得一丝不苟&#xff0c;电源也做了充分去耦&#xff0c;布线长度都匹配好了&#xff0c;结果一上电——USB 3.0辐射超标、DDR4眼图闭合、千兆以太网频…

作者头像 李华
网站建设 2026/6/14 11:18:27

图表数据提取实验:从PDF中读取柱状图信息

图表数据提取实验&#xff1a;从PDF中读取柱状图信息 在企业数据分析和科研文献处理的日常工作中&#xff0c;一个看似简单却长期困扰工程师与研究人员的问题是&#xff1a;如何高效地从PDF报告中的图表里“拿回”原始数据&#xff1f;尤其是那些只以视觉形式呈现、没有附带表格…

作者头像 李华
网站建设 2026/6/14 23:20:25

摘要生成效率对比:不同模型在anything-llm中的表现

摘要生成效率对比&#xff1a;不同模型在 Anything-LLM 中的表现 在信息爆炸的时代&#xff0c;我们每天面对的文档数量呈指数级增长——技术白皮书、行业报告、会议纪要、研究论文……如何从海量文本中快速抓住核心要点&#xff1f;传统搜索依赖关键词匹配&#xff0c;往往遗漏…

作者头像 李华
网站建设 2026/6/13 8:29:08

在Vivado2018.3中实现编码器/译码器的完整示例

从零开始&#xff1a;在 Vivado 2018.3 中构建编码器与译码器的实战指南你有没有遇到过这样的场景&#xff1f;系统里有8个中断源&#xff0c;但CPU只给你留了一个中断引脚。怎么办&#xff1f;总不能让每个设备轮流“喊”吧。这时候&#xff0c;编码器就派上用场了——它能把这…

作者头像 李华
网站建设 2026/6/15 18:56:17

人机协同办公新时代:AI成为正式团队成员

人机协同办公新时代&#xff1a;AI成为正式团队成员 在今天的知识型组织中&#xff0c;一个新员工入职后最头疼的往往不是业务本身&#xff0c;而是“爬文档”——翻遍邮件、NAS、共享盘和聊天记录&#xff0c;只为搞清楚某个项目的历史背景或流程规范。与此同时&#xff0c;HR…

作者头像 李华