首先定义基础模板类,表示不包含给定类型

template <typename T, typename... Args>
struct contains : public std::false_type {};

接着进行偏特化,将可变模板参数中的类型逐个和目标类型进行比较,直到类型相同或者模板参数列表为空

template <typename T, typename U, typename... Args>
struct contains<T, U, Args...> :public std::conditional_t<std::is_same_v<T, U>, std::true_type, contains<T, Args...>> {};

由于基础模板类的模板参数仅有T和Args两个,所以如果想要表示三个就需要进行特化

std::conditional是一个编译期类型选择模板库,使用方法如下

std::conditional<bool, type1, type2>::type

当布尔表达式为真时返回type1,为假时返回type2。注意布尔表达式必须可以在编译期计算出来

在contains的实现中,判断类型T和U是否相同,如果相同返回std::true_type类型,否则丢弃U,继续展开Args直到展开为空时,调用基础模板类,相当于返回std::false_type类型

测试程序

#include <tuple>
#include <vector>
#include <iostream>template <typename T, typename... Args>
struct contains : public std::false_type {};template <typename T, typename U, typename... Args>
struct contains<T, U, Args...> :public std::conditional_t<std::is_same_v<T, U>, std::true_type, contains<T, Args...>> {};template <typename... Args>
void contains_test(Args&&... ) {if constexpr (contains<std::string, Args...>::value) {std::cout << "contains std::string type" << std::endl;}else {std::cout << "don't contains std::string type" << std::endl;}
}
int main()
{contains_test(10, 2.5, std::vector<int>{1, 2, 3}, std::string("hello world"), 1);return 0;
}

C++代码片段(二)判断可变模板参数中是否包含某一特定类型相关推荐

  1. C++代码片段(三)过滤可变模板参数中某些类型的变量

    将可变模板参数列表中的某些类型过滤掉,然后返回剩下数据的元组.用到了上一篇中的判断可变模板参数中是否包含某一特定类型的方法 #include <iostream> #include < ...

  2. c++11新特性的使用---可变模板参数、lambda、type_traits、optional综合使用

    通过惰性求值类的实现综合采用了可变模板参数.lambda.type_traits.optional进行实现 该类功能是:当初始化某个对象时,该对象引用了一个大对象,这个对象的创建需要较长的时间,同时有 ...

  3. android代码片段二

    android代码片段二   1.Android拦截短信 一.AndroidManifest.xml<uses-permission android:name="android.per ...

  4. C++——可变模板参数

    声明:由于对可变模板参数了解资源有限,以下有些观点仅为个人参考手册实践得出的,不要被我个人的观点误导. 文章目录 一.基本语法知识 1.基本知识 2.基本语法 二.基本使用方法 1.基本演示 2.参数 ...

  5. C++ 获取可变模板参数类型

    本文以函数模板为例进行说明,类模板可以添加相应方法实现. 含有可变模板参数的函数模板如下所示. template <typename... Args>void Func(Args& ...

  6. containskey java_Java Map.containsKey()方法:判断Map集合对象中是否包含指定的键名

    搜索热词 Java 集合类中的 Map.containsKey() 方法判断 Map 集合对象中是否包含指定的键名.如果 Map 集合中包含指定的键名,则返回 true,否则返回 false. 语法: ...

  7. VSCode自定义代码片段1——vue主模板

    VSCode自定义代码片段(vue主模板) {// vue// 1,自定义用户代码片段:VSCode =>左下角设置 =>用户代码片段 => 自定义片段名称 =>编辑用户片段 ...

  8. c++11新特性的使用---可变模板参数、type_traits、function综合使用

    DLL帮助类 c++中手动调用dll是比较繁琐的,调用过程是:加载dll后还要定义一个对应的函数指针类型,接着调用GetProAddress获取函数地址,在转成函数指针,最后调用该函数如下例子: #i ...

  9. 【JS】1070- 8个工程必备的JavaScript代码片段(建议添加到项目中)

    8个工程必备的JavaScript代码片段,听过这样起博客标题可以提高阅读量.???? 最近写博客好累,让8月征文活动搞的,今天水一篇好了,麻烦不要给我点赞,不想看到消息通知的小红点. 1. 获取文件 ...

最新文章

  1. HTML页面中使两个div并排显示
  2. JS 中如何判断 undefined 和 null
  3. Spring框架简介
  4. python 编程之计算器
  5. 在lean trace mode下运行function
  6. 三维空间两直线/线段最短距离、线段计算算法 【转】
  7. SQL注入:4、数据库可写
  8. 渗透学习笔记--基础篇--sql注入(数字型)
  9. cad命令栏还原默认_CAD十五个必学的命令 掌握后能走天下了
  10. 特别实用的几种SQL语句送给大家,让你的SQL高大上!
  11. jdk Double类具体实现
  12. jQuery 前后端分离项目总结
  13. 关联本地项目和svn_技术贴 本地代码与svn关联教程 svn upgrade问题解决
  14. VoLTE业务端到端流程:IMS侧信令流程
  15. 【Python爬虫系列】Python 爬取上海链家二手房数据
  16. win10系统word2019显示目录只显示部分一级二级解决办法
  17. 高德地图定位,搜索,导航功能
  18. [下载]《SAP R/3 IDES 4.71 中文版》
  19. airpodspro窃听模式_AirPodsPro怎么切换模式
  20. viper4android md,【超级街霸4安卓版】超级街霸4安卓完整移植版游戏下载-街机中国...

热门文章

  1. linux 文件系统 代码,Linux文件系统介绍
  2. hikaricp 连接池分析_数据库连接池终于搞对了,这次直接从100ms优化到3ms!
  3. openssh升级sftp_CentOS6.5升级OpenSSH 8.3版本
  4. Linux SWAP 交换分区
  5. WKWebView进度及title
  6. android—获取网络数据
  7. BZOJ 3907: 网格( 组合数 + 高精度 )
  8. 安卓下的免费离线地图导航软件(老虎地图)测试及网盘下载
  9. (转)C#网络编程(订立协议和发送文件) - Part.4
  10. iframe的应用 实现无刷新用户注册