c++类型判断和获取原始类型

news/2024/12/25 23:22:29/

std::traits学习

类型判断和退化(获取原始类型)的原理就是利用模板的特例化。根据调用模板的特例化,在特例化模板中实现判断的逻辑或者退化的逻辑。

一、类型判断

判断整型数据的模板类

#include <iostream>  namespace zk {template<typename T, T Val>struct integral_constant {static constexpr T value = Val;};using false_type = integral_constant<bool, false>;using true_type = integral_constant<bool, true>;template<typename T>struct isInteger :false_type {};template<>struct isInteger<std::int8_t> :true_type {};template<>struct isInteger<std::int16_t> :true_type {};template<>struct isInteger<std::int32_t> :true_type {};template<>struct isInteger<std::int64_t> :true_type {};template<>struct isInteger<std::uint8_t> :true_type {};template<>struct isInteger<std::uint16_t> :true_type {};template<>struct isInteger<std::uint32_t> :true_type {};template<>struct isInteger<std::uint64_t> :true_type {};template<typename T>constexpr bool is_integer_v = isInteger<T>::value;
}int main() {if (zk::is_integer_v<std::string>) {std::cout << "is integer" << std::endl;}else {std::cout << "not integer" << std::endl;}if (zk::is_integer_v<std::int32_t>) {std::cout << "is integer" << std::endl;}if (zk::is_integer_v<std::uint32_t>) {std::cout << "is integer" << std::endl;}if (zk::is_integer_v<std::int64_t>) {std::cout << "is integer" << std::endl;}return 0;
}

其中

template<typename T, T Val>
struct integral_constant {static constexpr T value = Val;
};

申明定义了一个模板类,存放了一个由模板参数决定的静态常量成员变量。然后用这个模板类,申明并定义了false_type和true_type

using false_type = bool_constrait<bool, false>;
using true_type = bool_constrait<bool, true>;

然后定义一个模板类,默认匹配到模板类时,不是int整型

 template<typename T>struct isInteger :false_type {};

当匹配到特例化类时,是int整型

    template<>struct isInteger<std::int8_t> :true_type {};template<>struct isInteger<std::int16_t> :true_type {};template<>struct isInteger<std::int32_t> :true_type {};template<>struct isInteger<std::int64_t> :true_type {};template<>struct isInteger<std::uint8_t> :true_type {};template<>struct isInteger<std::uint16_t> :true_type {};template<>struct isInteger<std::uint32_t> :true_type {};template<>struct isInteger<std::uint64_t> :true_type {};

没写完,还有short、long、longlong等类型

二、退化(获取原始类型)

有时需要获取到一个对象的原始类型,不含指针、不含引用、不含右值引用等

#include <iostream>  namespace zk {template<typename T>struct decay {using type = T;};template<typename T>struct decay<T&> {using type = T;};template<typename T>struct decay<T&&> {using type = T;};template<typename T>struct decay<T*> {using type = T;};template<typename T>struct decay<std::shared_ptr<T>> {using type = T;};template<typename T>using decay_t = typename decay<T>::type;
}int main() {std::cout << "type : " << typeid(zk::decay_t<int>).name() << std::endl;std::cout << "type : " << typeid(zk::decay_t<int*>).name() << std::endl;std::cout << "type : " << typeid(zk::decay_t<std::shared_ptr<int>>).name() << std::endl;std::cout << "type : " << typeid(zk::decay_t<std::int32_t>).name() << std::endl;std::cout << "type : " << typeid(zk::decay_t<std::int32_t*>).name() << std::endl;std::cout << "type : " << typeid(zk::decay_t<std::shared_ptr<std::int32_t>>).name() << std::endl;std::cout << "type : " << typeid(zk::decay_t<std::string>).name() << std::endl;std::cout << "type : " << typeid(zk::decay_t<char*>).name() << std::endl;std::cout << "type : " << typeid(zk::decay_t<float*>).name() << std::endl;zk::decay_t<char*> a = 97;std::cout << "a : " << a << std::endl;return 0;
}

只移除了指针、引用和右值引用和共享指针。std::traits还可以还原出std::function、std::string等类型。我这里就没实现这两个了。


http://www.ppmy.cn/news/1558108.html

相关文章

Linux运维常见命令

vi/vim快捷键使用 1)拷贝当前行 yy ,拷贝当前行向下的5行 5yy&#xff0c;并粘贴&#xff08;输入p&#xff09;。 2)删除当前行 dd ,删除当前行向下的5行5dd 3)在文件中查找某个单词 [命令行下 /关键字&#xff0c;回车查找 ,输入n就是查找下一个 ] 4)设置文件的行号&…

Ubuntu 20.04 卸载和安装 MySQL8.0

卸载 首先&#xff0c;检查一下系统安装的软件包有哪些&#xff0c;使用dpkg -l | grep mysql命令&#xff1a; 为了将MySQL卸载干净&#xff0c;这些文件都需要被删除。 在Ubuntu20.04系统下&#xff0c;卸载干净MySQL8.0以确保下一次安装不会出错&#xff0c;可以按照以下…

微软的AI转型故事

在一次备受瞩目的深度访谈中&#xff0c;微软的CEO萨提亚纳德拉与著名投资人比尔格里和布拉德格斯特纳展开了一场关于微软十年转型与AI未来的深入探讨。这次对话不仅回顾了微软在纳德拉领导下的重大发展轨迹&#xff0c;也为AI时代的战略布局提供了洞见。 纳德拉的职业起点 故…

视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点

随着5G技术的广泛应用&#xff0c;各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据&#xff0c;并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而&#xff0c;随着数字化建设和生产经营管理活动的长期开展&#xff0…

闯关leetcode——3158. Find the XOR of Numbers Which Appear Twice

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/find-the-xor-of-numbers-which-appear-twice/description/ 内容 You are given an array nums, where each number in the array appears either once or twice. Return the bitwise XOR of all …

JavaAgent技术应用和原理:JVM持久化监控

背景 字节码增强技术 字节码增强&#xff1a;Java Agent通过修改字节码来实现对应用程序的增强&#xff0c;例如添加日志、性能监控、事务管理等。工具&#xff1a;常用的字节码增强工具包括ASM、Javassist、Byte Buddy等。 JavaAgent技术基于JVM工具接口&#xff08;JVMTI&…

京准电钟解读,NTP网络授时服务器如何提升DCS系统效率

京准电钟解读&#xff0c;NTP网络授时服务器如何提升DCS系统效率 京准电钟解读&#xff0c;NTP网络授时服务器如何提升DCS系统效率 NTP 网络授时服务器为防火墙内的网络设备、终端、服务器提供准确、可靠和安全的高精度卫星时间参考&#xff0c;可为它支持数万台支持标准的网…

Vue3中路由跳转之后删除携带的query参数

场景 今天在开发时遇到一个需求&#xff0c;需要页面跳转后&#xff0c;将路由携带的参数输入搜索框进行筛选&#xff0c;筛选条件回显后产生了一个问题&#xff0c;刷新页面筛选条件会一致存在&#xff0c;因为在页面挂载时将路由上的query参数赋值给了筛选条件&#xff0c;需…