news 2026/6/10 16:53:03

有意思的新特性: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/10 11:52:44

工业自动化中电源管理芯片的作用:通俗解释其工作原理

工业自动化中的“电力管家”&#xff1a;电源管理芯片如何默默守护系统稳定&#xff1f; 你有没有想过&#xff0c;一台高速运转的工业机器人、一条24小时不停歇的智能产线&#xff0c;它们背后真正支撑其持续运行的“隐形英雄”是谁&#xff1f;不是PLC&#xff0c;也不是伺服…

作者头像 李华
网站建设 2026/6/10 2:33:46

SLA服务等级协议制定:承诺可用性百分比

SLA服务等级协议制定&#xff1a;承诺可用性百分比 在企业级AI应用逐渐从“能用”走向“好用”的今天&#xff0c;一个常被忽视却至关重要的问题浮出水面&#xff1a;当用户点击提问按钮时&#xff0c;系统真的随时都能响应吗&#xff1f;尤其在金融、制造、医疗等对稳定性要求…

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

一文说清keil编译器下载v5.06安装全过程

从零开始搭建Keil开发环境&#xff1a;手把手带你装好MDK v5.06 你是不是也遇到过这种情况&#xff1f;刚接手一个STM32项目&#xff0c;前辈留下的工程是用Keil写的&#xff0c;而你的电脑上啥都没有。网上搜“keil编译器下载v5.06”&#xff0c;结果跳出来一堆广告、捆绑软件…

作者头像 李华
网站建设 2026/6/9 20:58:15

Protel99SE安装环境搭建:入门必看操作指南

如何在现代Windows系统上成功安装Protel99SE&#xff1f;这份实战指南讲透了所有坑 你是不是也遇到过这种情况&#xff1a;刚下载好Protel99SE的安装包&#xff0c;满怀期待地双击 setup.exe &#xff0c;结果弹出“无法初始化数据库”或直接闪退&#xff1f;别急——这几乎…

作者头像 李华
网站建设 2026/6/10 11:22:03

树莓派4b安装系统时Raspberry Pi Imager的正确打开方式

树莓派4B系统安装不翻车&#xff1a;Raspberry Pi Imager 的实战指南 你有没有经历过这样的场景&#xff1f; 新买的树莓派4B到手&#xff0c;满心欢喜插上电源&#xff0c;却发现屏幕黑屏、SSH连不上、Wi-Fi死活连不到——最后只能灰头土脸地重新烧卡。别急&#xff0c;问题…

作者头像 李华
网站建设 2026/6/10 8:36:09

ARM架构支持情况:能否在树莓派上运行?

ARM架构支持情况&#xff1a;能否在树莓派上运行&#xff1f; 在智能家居设备日益复杂的今天&#xff0c;确保无线连接的稳定性已成为一大设计挑战。然而&#xff0c;在边缘计算与本地AI应用快速崛起的当下&#xff0c;另一个问题正悄然浮现&#xff1a;我们能否在像树莓派这样…

作者头像 李华