C++标准模板(STL)- 类型支持 (特性上的运算,变参的逻辑或元函数,std::disjunction)

类型特性

类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。

试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。

定义于<type_traits>头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实例化标准库模板。

特性上的运算

变参的逻辑或元函数

std::disjunction

template<class... B>
struct disjunction;

(1)(C++17 起)

组成类型特性 B... 的逻辑析取,等效地在特性序列上进行逻辑或。

特化 std::disjunction<B1, ..., BN> 有一个公开且无歧义的基类,即

  • 若 sizeof...(B) == 0 ,则为 std::false_type ;否则
  • B1, ..., BN 中有 bool(Bi::value) == true ,则为首个 Bi ,或者若无这种类型则为 BN

不隐藏 disjunctionoperator= 以外的基类成员名,而它们在 disjunction 中无歧义地可用。

析取是短路的:若存在模板类型参数 Bi 满足 bool(Bi::value) != false,则实例化 disjunction<B1, ..., BN>::value 不要求 j > i 的 Bj::value 的实例化。

模板形参

B...-每个要实例化 Bi::value 的模板参数 Bi 必须可用作基类,且定义了可转换到 bool 的成员 value

辅助变量模板

template<class... B>
inline constexpr bool disjunction_v = disjunction<B...>::value;

(C++17 起)

可能的实现

template<class...> struct disjunction : std::false_type { };
template<class B1> struct disjunction<B1> : B1 { };
template<class B1, class... Bn>
struct disjunction<B1, Bn...> : std::conditional_t<bool(B1::value), B1, disjunction<Bn...>>  { };

注意

disjunction 的特化不需要继承自 std::true_type 或 std::false_type :它简单地继承自首个 B ,其 ::value 在显式转换为 bool 后为 true ,或在它们都转换为 false 时继承自最后的 B 。例如, std::disjunction<std::integral_constant<int, 2>, std::integral_constant<int, 4>>::value 为 2 。

disjunction 的短路实例化异于折叠表达式:如 (... || Bs::value) 的折叠表达式实例化 Bs 中的每个 B ,而 std::disjunction_v<Bs...> 一旦能确定值就停止实例化。这在之后的类型实例化代价高昂,或以错误的类型实例化能导致硬错误时特别有用。

调用示例

#include <type_traits>
#include <string>
#include <iostream>namespace std
{
template<class...> struct disjunction : std::false_type { };template<class B1> struct disjunction<B1> : B1 { };template< bool B, class T, class F >
using conditional_t = typename conditional<B, T, F>::type;template<class B1, class... Bn>
struct disjunction<B1, Bn...>
: conditional_t<bool(B1::value), B1, disjunction<Bn...>>  { };
}template<class... Ts>
struct first_constructible
{template<class T, class...Args>struct is_constructible_x : std::is_constructible<T, Args...>{using type = T;};struct fallback{static constexpr bool value = true;using type = void; // 若找不到内容则返回的类型};template<class... Args>using with = typename std::disjunction<is_constructible_x<Ts, Args...>...,fallback>::type;
};int main()
{// OK :不实例化 is_constructible<Foo, double>std::cout << "std::is_same<first_constructible<std::string, int>::with<>, std::string>::value:  "<< std::is_same<first_constructible<std::string, int>::with<>, std::string>::value<< std::endl;std::cout << "std::is_same<first_constructible<std::string, int>::with<const char*>, std::string>::value:   "<< std::is_same<first_constructible<std::string, int>::with<const char*>, std::string>::value<< std::endl;std::cout << "std::is_same<first_constructible<std::string, int>::with<void*>, void>::value:    "<< std::is_same<first_constructible<std::string, int>::with<void*>, void>::value<< std::endl;return 0;
}

输出

std::is_same<first_constructible<std::string, int>::with<>, std::string>::value:  1
std::is_same<first_constructible<std::string, int>::with<const char*>, std::string>::value:   1
std::is_same<first_constructible<std::string, int>::with<void*>, void>::value:    1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么让mac右上角的时间不显示

时间成了影响工作效率和心态的一个东西&#xff0c;当我看不见时间的时候我是听命于我的平静而稳定的内心的&#xff0c;当时间时刻在我的眼前晃动的时候&#xff0c;我是慌乱而浮躁的&#xff0c;所以我决定在我工作的时候我不需要时间&#xff0c;我要听命于自己的状态&#…

2023自动化测试框架的设计原则你都知道吗?快来看!

1.代码规范 测试框架随着业务推进&#xff0c;必然会涉及代码的二次开发&#xff0c;所以代码编写应符合通用规范&#xff0c;代码命名符合业界标准&#xff0c;并且代码层次清晰。特别在大型项目、多人协作型项目中&#xff0c;如果代码没有良好的规范&#xff0c;那么整个框架…

自动化测试 (二) Web自动化测试原理

目前市面上有很多Web UI自动化测试框架&#xff0c;比如WatiN, Selinimu,WebDriver&#xff0c;还有VS2010中的Coded UI等等. 这些框架都可以操作Web中的控件&#xff0c;模拟用户输入&#xff0c;点击等操作&#xff0c;实现Web自动化测试。其实这些工具的原理都一样&#xf…

现代雷达车载应用——第2章 汽车雷达系统原理 2.3节 信号模型

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.3 信号模型 雷达的发射机通常发出精心设计和定义明确的信号。然而&#xff0c;接收到的返回信号是多个分量的叠加&#xff0c;包括目标的反射、杂波…

1846_安全SPI

Grey 全部学习内容汇总&#xff1a;GitHub - GreyZhang/g_embedded: some embedded basic knowledge. 1846_安全SPI SPI是一种常见的通信方式&#xff0c;在汽车电子中比较常用。但是如果涉及到安全相关的设计&#xff0c;可能得考虑更多。而SPI协议本身没有很好的标准化&am…

Jtti:ubuntu怎么删除多余的内核?

在 Ubuntu 中&#xff0c;你可以使用以下步骤删除多余的内核&#xff1a; 1. 查看当前安装的内核版本&#xff1a; uname -r 此命令将显示当前正在使用的内核版本。 2. 列出已安装的内核&#xff1a; dpkg --list | grep linux-image 此命令将列出所有已安装的 Linux 内核镜像。…

819. 最常见的单词

819. 最常见的单词 Java&#xff1a;split() 过滤 class Solution {public String mostCommonWord(String paragraph, String[] banned) {String s paragraph.replaceAll("\\p{Punct}", " "); // 去除所有标点符号String arr[] s.split(" "…

Google视频广告的格式

Google是全球最大的搜索引擎和在线广告平台之一&#xff0c;也提供了广告服务&#xff0c;包括在其视频平台上展示视频广告。Google视频广告是一种强大的营销工具&#xff0c;可以帮助企业将品牌推广到更广泛的受众中。 Google视频广告的格式可以分为以下几种&#xff1a; 1、…

通俗易懂:插入排序算法全解析(C++)

插入排序算法是一种简单直观的排序算法&#xff0c;它的原理就像我们玩扑克牌时整理手中的牌一样。下面我将用通俗易懂的方式来解释插入排序算法的工作原理。 假设我们手上有一副无序的扑克牌&#xff0c;我们的目标是将它们从小到大排列起来。插入排序算法的思想是&#xff0…

Python循环代码性能优化的方法

循环代码优化&#xff0c;遵守下面三个原则可以大大提高运行效率&#xff0c;避免不必要的低效计算&#xff1a; 1.尽量减少循环内部不必要的计算 2.嵌套循环中&#xff0c;尽量减少内层循环的计算&#xff0c;尽可能向外提。 3.局部变量查询较快&#xff0c;尽量使用局部变量 …

vue整个页面可以拖拽导入文件

效果图 原理与源码 我们这里的思路是用ant组件库的upload组件&#xff0c;就是如下这个 用这个包裹住所有页面&#xff0c;你可以是包裹住App.vue&#xff0c;或者是你的homepage。但是这个涉及到一个问题&#xff0c;就是我们现在确实是可以拖拽导进来文件了&#xff0c;但是…

2.两数相加

借文引流&#xff1a;五点钟科技_大道至简系列,机器学习算法系列,学习经验分享-CSDN博客 欢迎大家阅览我的其它专栏。 题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数…

台式扫描电镜与落地式扫描电镜详细对比

随着材料科学和微纳技术的快速发展&#xff0c;扫描电子显微镜已成为研究微观结构的一种重要工具。根据外形体积的不同&#xff0c;扫描电镜可以分为两大类:落地式扫描电镜和台式扫描电镜。本文将从探测器、易操作性、安装环境和价格等多个方面对两者进行比较。 一、发展历史 …

迎接更高效的数据安全合规与风险评估,美创科技DCAS正式商用发布!

数据安全合规与风险评估&#xff0c;是清晰数据安全合规与风险差距&#xff0c;实现可落地数据安全建设和持续改进的关键一环。然而实施起来&#xff0c;你的团队是否面临着这些烦恼&#xff1a; 数据安全合规要求繁多&#xff0c;难以全面掌握&#xff1f; 复杂评估流程带来效…

Java中将List集合数据转成带反斜杠的字符串格式

List<Map<String, Object>> trajectoryTrackList 得到数据&#xff1a;[{latitude32.01813267498781, coord_type_inputwgs84, loc_time1702505122, longitude118.69349822755345}, {latitude32.01816666340177, coord_type_inputwgs84, loc_time1702505255, longi…

Unity | Shader基础知识(第四集:Shader结构体)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、结构体的需求 1 数据的接入 2 开始写结构体 三、unity封装好的结构体 1 unity封装好了很多结构体 2 如何使用封装好的结构体 四、下集预告 一、本节介绍 1 上集回顾 上一集&#xff0c;我们做了一个可以改变颜色的案例…

如何使用 Flutter 和地理位置 API 构建基于位置的移动应用程序?

基于位置的移动应用程序是当今智能手机用户的新动力。借助这些应用程序&#xff0c;人们可以使用地图来确定正确的路线。跟踪实时位置、搜索附近感兴趣的地点以及使用其他各种基于位置的服务 (LBS)。 如今&#xff0c;对基于位置的应用程序的需求大幅增加。移动应用中地理定位…

Java stream 进阶版

1、Stream 概述 Java 8 引入了 Stream API,它是一种用于简化集合和数组操作的强大工具。Stream API 允许我们将集合或数组视为流,并在流上进行各种操作,如筛选、排序、聚合等。 Stream API 的核心概念是 Stream 流,它代表了一个数据流,其中包含了一系列的元素。这些元素…

js/jquery之input 复选框checkbox、单选按钮radio选中判断

之前总是用&#xff0c;总是遇到坑&#xff0c;解决起来总是需要实践回想。通过这次使用顺便做个简单的总结&#xff0c; 百度了资料&#xff0c;推荐的这个博客很不错&#xff0c;下面只是做了简单的改名字处理&#xff0c;基本是是贴的另一个博客内容。 唯一不一样的是&…

火狐浏览器怎么设置网络代理?代理起到了哪些作用

火狐浏览器是一款流行的网页浏览器&#xff0c;它支持多种网络代理设置。设置网络代理可以帮助用户访问某些网站或提高网络访问速度。但是&#xff0c;使用代理IP时需要注意一些事项&#xff0c;以确保安全和正常使用。 以下是在火狐浏览器中设置网络代理的步骤&#xff1a; 1.…