news 2026/5/23 18:57:18

C++编程实践——std::void_t的实践应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++编程实践——std::void_t的实践应用

一、介绍

在前面已经分析过C++17中的std::void_t,对其已经有了一个整体的认知,同时对标准中对std::void_t的相关技术细节进行了分析说明。虽然对其的应用也进行了初步的分析,但如何在实际的工程实践中进行应用以及其应用的场景,还需要进一步的展开。
先回忆一下标准库的实现:

template<class...>usingvoid_t=void;

它采用变参模板,将任意数量的类型参数映射为 void 类型。
不过对于刚刚接触模板技术的开发者来说,可能不好理解,可以按下面的方式来看就容易理解了:

template<typename...Ts>structmake_void{using type=void;};template<typename...Ts>usingvoid_t=typename make_void<Ts...>::type;

当模板被实例化时,make_void<Ts…>会让其内部成员type始终是void类型。其本质也是依赖于SFINAE技术。即模板参数列表中的类型或表达式(比如decltype(…))无效时,std::void_t的别名定义会无法定义成功,进而触发 SFINAE,将该特化模板从候选模板中移除,不会引发编译错误。

二、工程实践的应用方式

在实际的工程实践中,应用的场景很多,但应用的方法主要包括:

  1. 做为默认值
    模板开发中,经常会遇到默认参数的情况:
template<typename T,typename U=std::void_t<>>structDemo;
  1. SFINAE的触发
    与decltype等配合使用进行SFINAE的触发,比如下面的情况:
// 通用模板template<typename T,typename=void>class Demo{...};template<typename T>class Demo<T,std::void_t<decltype(std::declval<T>().try()),decltype(std::declval<T>().tryTest())>>{...};
  1. 模板的特化处理
    利用std::void_t进行模板的偏特化:
// size() 成员函数检测template<typename T,typename=void>structcheckSize:std::false_type{};template<typename T>structcheckSize<T,std::void_t<decltype(std::declval<T>().size())>>:std::true_type{};

std::void_t应用非常广泛,它可以在SFINAE的应用中大大减化相关的复杂度,同时,在某些C++20概念无法应用的场景下它又可以起到某些替换的能力 。虽然上面的总结有些粗浅,但也是从另外一个角度对std::void_t的应用进行一个初步的尝试。大家可以继续在此基础上进行补充,加强自己的学习和总结能力。

三、应用场景

虽然在前面的std::void_t说明分析中对其应用进行了初步的分析总结,但条理性不太清楚,这次再整体总结一下:

  1. 类型特性的单一检测
    如常见的属性、函数以及相关特定的操作(如操作运算符、智能指针和嵌套等)等
  2. 多类型特性的检测
    即对属性、函数等进行多项控制检测
  3. SFINAE的应用
    即将std::void_t应用于复杂的SFINAE技术应用中,如表达式的有效性等
  4. 实现Conecpts
    这种一般属于开发者在早期版本中想应用一些类似概念的实现

四、例程

看一下相关应用例程:

#include<iostream>#include<type_traits>// 检测类型别名template<typename,typename=std::void_t<>>structcheck_type_member:std::false_type{};template<typename T>structcheck_type_member<T,std::void_t<typename T::type>>:std::true_type{};// 检测成员变量template<typename,typename=std::void_t<>>structcheck_member:std::false_type{};template<typename T>structcheck_member<T,std::void_t<decltype(T::data)>>:std::true_type{};// 检测成员函数template<typename,typename=std::void_t<>>structcheck_display:std::false_type{};template<typename T>structcheck_display<T,std::void_t<decltype(std::declval<T>().display())>>:std::true_type{};// 检测智能指针template<typename,typename=std::void_t<>>structis_smart_pointer:std::false_type{};template<typename T>structis_smart_pointer<T,std::void_t<decltype(std::declval<T>().operator->()),decltype(std::declval<T>().get())>>:std::true_type{};structDemoType{using type=int;};structDemoNoType{};structDemoMember{intdata;};structDemoNoMember{};structDemoDisplay{voiddisplay(){}};structDemoNoDisplay{};structDemoSmartPtr{int*operator->();void*get();};structDemoNotSmart{};intmain(){std::cout<<"type is exist: "<<check_type_member<DemoType>::value<<std::endl;std::cout<<"type is exist: "<<check_type_member<DemoNoType>::value<<std::endl;std::cout<<"Does member data exist: "<<check_member<DemoMember>::value<<std::endl;std::cout<<"Does member data exist: "<<check_member<DemoNoMember>::value<<std::endl;std::cout<<"function:display is: "<<check_display<DemoDisplay>::value<<std::endl;std::cout<<"function:display is: "<<check_display<DemoNoDisplay>::value<<std::endl;std::cout<<"SmartPtr :is a smart pointer: "<<is_smart_pointer<DemoSmartPtr>::value<<std::endl;std::cout<<"NotSmart: is a smart pointer:"<<is_smart_pointer<DemoNotSmart>::value<<std::endl;return0;}

前面的is_detected的实现也利用了std::void_t,大家可以回过头去看看,这样可以互相印证,加深理解。另外如果想进行联合检测除了使用传统的方法(如SFINAE)外也可以使用std::conjunction来进行多个状态值的整体判断。
在看明白上述的代码后,就可以从网上找一段复杂的相关的例子自行拆解,会发现很容易就明白了开发者编写的目的。

五、总结

std::void_t虽然是在C++17中引入的,但其实在早期的版本中就有类似的实践。大家可以理解为std::void_t是对SFINAE技术和模板特化的一种标准化处理。通过对std::void_t的应用,大家可以从中学习一些相关的开发技巧,引入到自己的开发中去。

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

终极VISIO电气电子元件库:1000+专业元件图开放获取

本仓库提供完全开放的VISIO电气电子元件库&#xff0c;包含1000专业电气电子元件图&#xff0c;专为电气电子专业学生、工程师和设计人员量身打造&#xff0c;让您快速绘制强电、弱电等各类专业图纸。 【免费下载链接】VISIO电气电子元件库 本仓库提供了一个名为“VISIO电气电子…

作者头像 李华
网站建设 2026/5/21 2:39:17

全国空气质量数据集深度解析:从环境监测到决策支持

全国空气质量监测数据集作为环境科学领域的重要资源&#xff0c;为研究人员和政策制定者提供了宝贵的数据支撑。这个包含197个城市详细记录的空气质量数据集&#xff0c;涵盖了从基础污染物浓度到复杂趋势分析的全方位信息&#xff0c;是环境监测和数据分析的理想选择。 【免费…

作者头像 李华
网站建设 2026/5/5 15:21:31

大数据批处理入门:从零开始掌握Hadoop核心技术

大数据批处理入门:从零开始掌握Hadoop核心技术 关键词:大数据批处理、Hadoop、HDFS、MapReduce、YARN、分布式存储、分布式计算 摘要:本文是大数据批处理的入门指南,以Hadoop核心技术为核心,通过生活比喻、代码示例和实战操作,逐步讲解HDFS分布式存储、MapReduce计算框架…

作者头像 李华
网站建设 2026/5/12 2:53:43

IEEE802.3-2022标准完整指南:获取以太网技术终极资源

IEEE802.3-2022标准完整指南&#xff1a;获取以太网技术终极资源 【免费下载链接】IEEE802.3-2022标准全文下载分享 - **文件名称**: IEEE802.3-2022标准全文.pdf- **文件大小**: 100MB- **文件格式**: PDF- **文件内容**: IEEE802.3-2022标准的完整内容&#xff0c;包括所有章…

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

EASE 4.0:重新定义专业声学设计体验

EASE 4.0&#xff1a;重新定义专业声学设计体验 【免费下载链接】EASE4.0安装包 EASE 4.0是一款专业的音响和声学设计软件&#xff0c;专为音响工程师和声学设计师打造&#xff0c;提供精准的声场模拟与分析功能。软件集成了丰富的设计工具&#xff0c;支持详细的声场分析和多样…

作者头像 李华
网站建设 2026/5/22 8:09:59

LightX2V:流式推理技术如何重新定义实时视频生成边界

LightX2V&#xff1a;流式推理技术如何重新定义实时视频生成边界 【免费下载链接】lightx2v 项目地址: https://gitcode.com/GitHub_Trending/li/lightx2v 在AI视频生成领域&#xff0c;我们正见证一场从"批量处理"到"实时交互"的深刻变革。当传统…

作者头像 李华