news 2026/5/13 1:37:19

有意思的新特性: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/5/13 12:46:54

组合逻辑电路FPGA实现新手教程

从零开始&#xff1a;在FPGA上实现组合逻辑电路的完整实战指南 你有没有遇到过这样的情况——明明代码写得“看起来没问题”&#xff0c;下载到FPGA后输出却乱跳&#xff0c;甚至综合工具悄悄给你塞了个 锁存器&#xff08;Latch&#xff09; &#xff1f;别急&#xff0c;这…

作者头像 李华
网站建设 2026/5/13 12:46:38

pip install 报错This environment is externally managed

1. 问题描述 在按照 ms-agent 教程安装 ms-agent 时&#xff0c;运行下述命令后报错 cd ms-agent pip3 install -e .# 该安装命令解释&#xff1a; # pip install&#xff1a;使用 pip 安装 Python 包。 # -e&#xff1a;表示 “editable”&#xff08;可编辑&#xff09;…

作者头像 李华
网站建设 2026/5/12 13:11:05

知识图谱构建雏形:实体关系抽取初步实现

知识图谱构建雏形&#xff1a;实体关系抽取的轻量级实现路径 在企业知识管理日益复杂的今天&#xff0c;如何从成千上万页的技术文档、产品手册和运维日志中快速提炼出可被系统理解的结构化知识&#xff0c;成为不少团队面临的现实挑战。传统知识图谱构建往往依赖大量标注数据与…

作者头像 李华
网站建设 2026/5/13 12:45:55

高速PCB设计规则中的信号完整性深度剖析

高速PCB设计中的信号完整性实战指南&#xff1a;从理论到落地在调试一块新板子时&#xff0c;你是否遇到过这样的场景&#xff1f;示波器上的眼图几乎闭合&#xff0c;数据误码频繁发生&#xff0c;而系统却“看起来”布线规整、电源干净、原理图也毫无破绽。最终排查数周才发现…

作者头像 李华
网站建设 2026/5/10 6:06:23

新手必看:Multisim元器件图标在14和Ultimate中的应用差异

新手避坑指南&#xff1a;Multisim 14 和 Ultimate 元器件图标使用差异全解析你有没有遇到过这种情况&#xff1a;在 Multisim 里找一个三极管&#xff0c;明明记得叫“2N2222”&#xff0c;可怎么翻都找不到&#xff1f;或者好不容易画好了电路图&#xff0c;仿真结果却完全不…

作者头像 李华
网站建设 2026/5/10 8:23:58

[Web自动化] CSS布局与定位

4.3 CSS布局与定位 4.3.1 布局 布局是CSS中用于构建网页结构的关键部分。理解布局的基础概念对于设计响应式和适应性强的网页至关重要。 盒子模型&#xff08;Box Model&#xff09;&#xff1a; CSS中的每个元素都可以看作是一个盒子&#xff0c;包括&#xff1a; 外边距&…

作者头像 李华