类型萃取类型比较 Type-Traits Librarytype comparisons --- C++20

类型萃取:类型比较 Type-Traits Library:type comparisons — C++20

不涉及runtime只在编译期

Comparing types 类型比较

C++11 支持三种类型:

  • is_base_of<Base, Derived>
  • is_convertible<From, To>
  • is_same<T, U>

C++20新加了几种:

  • is_pointer_interconvertible_with_class<From, To>

    检查一个类型的对象是否与该类型的指定对象指针可互转换

  • is_pointer_interconvertible_base_of<Base, Derived>

    检查一个类型的对象是否与该类型的指定子对象指针可互转换

#include <iostream>
#include <type_traits>
using namespace std;class BaseClass
{
public:int a;
};class DerivedClass : public BaseClass
{
public:int b;
};int main(int argc, char* argv[])
{cout << boolalpha << endl;cout << is_base_of<BaseClass, DerivedClass>::value << endl;cout << is_convertible<int, double>::value << endl;cout << is_convertible<int, string>::value << endl;cout << is_same<int, int>::value << endl;}

#include <type_traits>
#include <iostream>struct Foo { int x; };
struct Bar { int y; };struct Baz : Foo, Bar {}; // 非标准布局int main()
{std::cout << std::boolalpha<< std::is_same_v<decltype(&Baz::x), int Baz::*><< std::is_pointer_interconvertible_with_class(&Baz::x) << '\n'<< std::is_pointer_interconvertible_with_class<Baz>(&Baz::x) << '\n';
}

std::is_pointer_interconvertible_with_class - cppreference.com

可能的实现方式

std::is_same

#include <iostream>
#include <type_traits>namespace rgr {template<class T, T v>struct integral_constant {static constexpr T value = v;typedef T value_type;typedef integral_constant type;constexpr operator value_type() const noexcept { return value; }constexpr value_type operator()() const noexcept { return value; } //since c++14};typedef integral_constant<bool, true> true_type;                      // (2)              typedef integral_constant<bool, false> false_type;template<class T, class U>struct is_same : false_type {};                                       // (3)template<class T>struct is_same<T, T> : true_type {};}int main() {std::cout << '\n';std::cout << std::boolalpha;std::cout << "rgr::is_same<int, const int>::value: " << rgr::is_same<int, const int>::value << '\n';          // (1)std::cout << "rgr::is_same<int, volatile int>::value: " << rgr::is_same<int, volatile int>::value << '\n';std::cout << "rgr::is_same<int, int>::value: "  << rgr::is_same<int, int>::value << '\n';std::cout << '\n';std::cout << "std::is_same<int, const int>::value: " << std::is_same<int, const int>::value << '\n';std::cout << "std::is_same<int, volatile int>::value: " << std::is_same<int, volatile int>::value << '\n';std::cout << "std::is_same<int, int>::value: "  << std::is_same<int, int>::value << '\n';std::cout << '\n';}

调用函数模板rgr::is_same<int, const int>就是调用模板函数false_type::value,因为is_same : false_type {};

忽略constvolatile版本

#include <iostream>
#include <type_traits>namespace rgr {template<class T, T v>struct integral_constant {static constexpr T value = v;typedef T value_type;typedef integral_constant type;constexpr operator value_type() const noexcept { return value; }constexpr value_type operator()() const noexcept { return value; } //since c++14};typedef integral_constant<bool, true> true_type;                       typedef integral_constant<bool, false> false_type;template<class T, class U>struct is_same : false_type {};template<class T>struct is_same<T, T> : true_type {};template<typename T, typename U>                                    // (1)struct isSameIgnoringConstVolatile: rgr::integral_constant<bool,rgr::is_same<typename std::remove_cv<T>::type, typename std::remove_cv<U>::type>::value  > {};}int main() {std::cout << '\n';std::cout << std::boolalpha;std::cout << "rgr::isSameIgnoringConstVolatile<int, const int>::value: " << rgr::isSameIgnoringConstVolatile<int, const int>::value << '\n';std::cout << "rgr::is_same<int, volatile int>::value: " << rgr::isSameIgnoringConstVolatile<int, volatile int>::value << '\n';std::cout << "rgr::isSameIgnoringConstVolatile<int, int>::value: "  << rgr::isSameIgnoringConstVolatile<int, int>::value << '\n';std::cout << '\n';}

使用std::remove_cv移除constvolatile

std::is_base_of

namespace details {template <typename B>std::true_type test_pre_ptr_convertible(const volatile B*);template <typename>std::false_type test_pre_ptr_convertible(const volatile void*);template <typename, typename>auto test_pre_is_base_of(...) -> std::true_type;template <typename B, typename D>auto test_pre_is_base_of(int) ->decltype(test_pre_ptr_convertible<B>(static_cast<D*>(nullptr)));
}template <typename Base, typename Derived>
struct is_base_of :std::integral_constant<bool,std::is_class<Base>::value && std::is_class<Derived>::value &&decltype(details::test_pre_is_base_of<Base, Derived>(0))::value> { };

std::is_convertible

namespace detail {template<class T>
auto test_returnable(int) -> decltype(void(static_cast<T(*)()>(nullptr)), std::true_type{}
);
template<class>
auto test_returnable(...) -> std::false_type;template<class From, class To>
auto test_implicitly_convertible(int) -> decltype(void(std::declval<void(&)(To)>()(std::declval<From>())), std::true_type{}
);
template<class, class>
auto test_implicitly_convertible(...) -> std::false_type;} // namespace detailtemplate<class From, class To>
struct is_convertible : std::integral_constant<bool,(decltype(detail::test_returnable<To>(0))::value &&decltype(detail::test_implicitly_convertible<From, To>(0))::value) ||(std::is_void<From>::value && std::is_void<To>::value)
> {};

这东西好难,智商太低…


最全C++11/14/17/20/23 的新特性代码案例 - 知乎 (zhihu.com)

The Type-Traits Library: Type Comparisons - ModernesCpp.com

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

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

相关文章

SBO部分SQL查询奉献

产品生产主计划SELECT T0.MsnCode AS 计划单号, T1.ItemCode, T2.itemname AS 产品名称,T1.Quantity as 生产数量, T2.onhand,T2.onorder as 已下单,T1.StartDate, T1.EndDate, T1.BaseDocNum as 订单号,T1.BaseDue as 完工日期,T1.ParentCode as 产品名 FROM OMSN T0 INNER JO…

react(87)--控制禁用disabled

<Form.Item label"活动详情" required validateStatus{textErr} help{textMsg}><BaseRichTextdisabledheight{360}editorState{introeditorState}handleEditorChange{this.handleEditorChange}/></Form.Item>

奇葩面试经历一

大清早坐车到**公司坐等面试&#xff0c;前台MM热情招待把哥们安置到一个小会议室&#xff0c;顺便给了一张资料填写单。 急吼吼的把资料填写完啦后&#xff0c;MM说让俺们在会议室稍等一下。不久&#xff0c;带哥来到一办公司门口&#xff0c;打眼一瞧&#xff0c;回到&#x…

判断一个无符号整数是不是2的幂

C版本&#xff1a; #include<stdio.h> //原理&#xff1a;2的幂的二进制位中有且只有一位是1int Is2Power(unsigned int d){ int i sizeof(d) << 3; //这里i得到d所占的位数(bits)&#xff0c;因为要对d的每一位作判断 unsigned int v; while(i > 0) { v 1…

童趣

1.豆豆的外婆买了一只母鸡&#xff0c;打算杀了吃。豆豆不允许杀它&#xff0c;外婆就把鸡养在院子里。每天早上&#xff0c;外婆在院子里干家务&#xff0c;豆豆就坐在小板凳上&#xff0c;手里拿了本小画书&#xff0c;绘声绘色地给母鸡讲故事。豆豆给母鸡起的小名是“小鸭”…

PROJECT #1 - BUFFER POOL [CMU 15-445645]笔记

PROJECT #1 - BUFFER POOL 15-445/645笔记 因为在主存中储存所有块是不可能的&#xff0c;我们需要管理主存中用于存储块的可用空间的分配 。缓冲区是主存中用于存储磁盘数据块拷贝的那部分。 缓冲区管理器 ​ 当数据库系统中的程序需要磁盘上的块时&#xff0c;它向缓冲区管…

判断一个无符号整数是不是2的n次幂的幂

C版本&#xff1a; #include<stdio.h> unsigned int f2(int n); //判断无符号整数d是不是[2的n次幂]的幂,并指出该数[d]是[2的n次幂]的多少(e)次幂//原理&#xff1a;2的n次幂的幂的二进制位中有且只有一位是1,且1后面刚好是n个0为一组int IsPowerof2Power(unsigned in…

Eclipse换常用的快捷键

还是喜欢ctrltab键来切换窗口&#xff0c;ctrlf6实在不好使。 修改方法&#xff1a;在eclipse中Window -> Perferences -> General -> Keys -> 查找“Next Editor”&#xff0c;把Ctrl F6修改为Ctrl Tab 转载于:https://www.cnblogs.com/HD/p/3654197.html

MS SQL入门基础:系统数据库

SQL Server 2000 有四个系统数据库&#xff08;System Databases&#xff09;&#xff1a;Master、Model、Msdb、Tempdb。这些系统数据库的文件存储在Microsoft SQL Server&#xff08;默认安装目录&#xff09;的MSSQL子目录的Data 文件夹中。各系统数据库所包含的文件如表6-1…

C++20 std::jthread

C20 std::jthread std::jthread 表示 joining thread , 与C11里面的std::thread不同std::jthread 自动join, 并且可以被外部终止 自动join std::thread #include <iostream> #include <thread> using namespace std;int main(int argc, char* argv[]) {std::cou…

WebRTC音视频引擎研究(2)--VoiceEngine音频编解码器数据结构以及参数设置

1、VoiceEngine Codec数据结构 WebRTC中&#xff0c;用一个结构体struct CodecInst表示特定的音频编解码器对象&#xff1a; [cpp] view plaincopy struct CodecInst { int pltype; //payload type负载类型 char plname[32]; //payload name负载名称&#xff0…

.NET资源收集

.NET开发资源精华收集与共享 .Net General微软.Net中文主页 .NET Framework开发中心 微软.Net Framework中文产品支持中心 微软.Net Framework中文新闻组(Web) 微软VB.Net中文新闻组(Web) 博客园 .NET 2.0 专题 孟宪会之精彩世界 微软.NET俱乐部 MSDN中文网络广播 AspxBoy教程网…

小程序学习(2):vs code 安装插件

1. wechat-snippet 微信小程序代码辅助,代码片段自动完成 2. minapp 微信小程序标签、属性的智能补全&#xff08;同时支持原生小程序、mpvue 和 wepy 框架&#xff0c;并提供 snippets&#xff09; 需要输入<才会触发标签补全输入空格会触发对应标签的属性补全 3. wxapp-…

C++ 20 内存模型(一)

C 20 内存模型(一) 多线程的基础是优秀的内存模型 C20 内存模型: 高复杂性, 难以理解对多线程有更深入的理解 内存布局 位域 member_name成员名, width bit 宽度 struct bit_field_name {type member_name : width; };struct my_struct {char a;int b : 5; // 最大存储 …

char[]:strlen和sizeof的区别

C code: // char[]&#xff1a;strlen和sizeof的区别#include <stdio.h>#include <string.h>int main(int argc, char* argv[]){char str[] "Hello man";printf("str %s\nstrlen(str) %d\nsizeof(str) %d\n", str, strlen(str), sizeof(st…

讲话的技巧

名人的精神讲话&#xff08;有话则短&#xff0c;无话则免&#xff09;有人问美国第28任总统伍德罗.威尔逊,他准备一份10分钟的讲稿,得花多少时间?威尔逊答&#xff1a;“两星期。”“准备一份1小时的讲稿呢&#xff1f;”“一星期。”“两个小时的讲稿&#xff1f;”“不用准…

sql-C#-类型对应

bitbooltinyintbytesmallintshortintintbigintlongrealfloatfloatdoublemoneydecimaldatetimeDateTimecharstringvarcharstringncharstringnvarcharstringtextstringntextstringimagebyte[]binarybyte[]uniqueidentifierGuid/ SqlDbType转换为C#数据类型 public static Type Sq…