当前位置: 首页 > news >正文

C++标准模板(STL)- 类型支持 (类型属性,检查类型是否拥有强结构相等性,std::has_strong_structural_equality)

类型特性


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

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

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

类型属性

检查类型是否拥有强结构相等性

std::has_strong_structural_equality

template< class T >
struct has_strong_structural_equality;

(C++20 起)

T 拥有强结构相等性,则提供等于 true 的成员常量 value 。对于任何其他类型 value 为 false 。

模板形参

T-要检查的类型

辅助变量模板

template< class T >
inline constexpr bool has_strong_structural_equality_v = has_strong_structural_equality<T>::value;

(C++20 起)

继承自 std::integral_constant

成员常量

value

[静态]

T 拥有强结构相等性则为 true ,否则为 false
(公开静态成员常量)

成员函数

operator bool

转换对象为 bool ,返回 value
(公开成员函数)

operator()

(C++14)

返回 value
(公开成员函数)

成员类型

类型定义
value_typebool
typestd::integral_constant<bool, value>

注解

此类型特征可用于检查一个类型能否用作非类型模板形参。

调用示例

#include <type_traits>
#include <cstring>
#include <algorithm>
#include <iostream>namespace std
{
template<typename... Ts> struct make_void
{typedef void type;
};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;template <typename T, typename = void>
struct has_strong_structural_equality : std::false_type {};template <typename T>
struct has_strong_structural_equality<T, std::void_t<decltype(std::declval<T>() == std::declval<T>())>> : std::true_type
{template<typename, typename>static std::false_type test(...);using type = decltype(test<T, T>(0));
};template<typename T, typename U>
using has_strong_structural_equality_t = typename has_strong_structural_equality<T, U>::type;template <typename T>
const bool has_strong_structural_equality_v = has_strong_structural_equality<T>::value;
}class E
{
public:template<class T> E(T&&) { }
};class A {};
class B : public A {};
class C {};
class D
{
public:operator C(){return c;}  C c;
};struct MyStruct
{int x;double y;
};// 自定义比较运算符
bool operator==(const MyStruct& lhs, const MyStruct& rhs)
{return lhs.x == rhs.x && lhs.y == rhs.y;
}int main()
{std::cout << std::boolalpha;std::cout << "std::has_strong_structural_equality<A>::value:       "<< std::has_strong_structural_equality<A>::value << std::endl;std::cout << "std::has_strong_structural_equality<E>::value:       "<< std::has_strong_structural_equality<E>::value << std::endl;std::cout << "std::has_strong_structural_equality<float>::value:   "<< std::has_strong_structural_equality<float>::value << std::endl;std::cout << "std::has_strong_structural_equality<int>::value:     "<< std::has_strong_structural_equality<int>::value << std::endl;std::cout << "std::has_strong_structural_equality<char>::value:    "<< std::has_strong_structural_equality<char>::value << std::endl;std::cout << "std::has_strong_structural_equality<bool>::value:    "<< std::has_strong_structural_equality<bool>::value << std::endl;std::cout << "std::has_strong_structural_equality<MyStruct>::value:"<< std::has_strong_structural_equality<MyStruct>::value << std::endl;std::cout << "-----------------------------------------------" << std::endl;std::cout << std::endl;return 0;
}

输出

std::has_strong_structural_equality<A>::value:       false
std::has_strong_structural_equality<E>::value:       false
std::has_strong_structural_equality<float>::value:   true
std::has_strong_structural_equality<int>::value:     true
std::has_strong_structural_equality<char>::value:    true
std::has_strong_structural_equality<bool>::value:    true
std::has_strong_structural_equality<MyStruct>::value:true
-----------------------------------------------

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 清除 Nuxt 状态缓存:clearNuxtState
  • SQL进阶
  • AI学习记录 - 如何进行token理论知识,以GPT2为举例
  • 【鸿蒙学习】鸿蒙开发学习路径:迈向鸿蒙高级认证之路
  • python-热杆上的蚂蚁(赛氪OJ)
  • C/C++数字与字符串互相转换
  • 240808opencv中反向投影
  • 【学习笔记】Day 7
  • PHP MySQL 读取数据
  • 模块化叙事的演变:DeFi借贷开发的模块化转型
  • Web前端开发具有哪些特点?
  • 大学新生的编程入门攻略
  • 数据库(详解)-系统架构师(四十四)
  • 你了解堆和栈的由来吗?
  • JavaScript异步简介|Promise快速入门
  • [PHP内核探索]PHP中的哈希表
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • __proto__ 和 prototype的关系
  • 【前端学习】-粗谈选择器
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Fabric架构演变之路
  • IOS评论框不贴底(ios12新bug)
  • JavaScript 奇技淫巧
  • Java比较器对数组,集合排序
  • Redis学习笔记 - pipline(流水线、管道)
  • text-decoration与color属性
  • Vue UI框架库开发介绍
  • windows-nginx-https-本地配置
  • 实现简单的正则表达式引擎
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 新手搭建网站的主要流程
  • 一个SAP顾问在美国的这些年
  • 在Unity中实现一个简单的消息管理器
  • 智能网联汽车信息安全
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #pragma data_seg 共享数据区(转)
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (2015)JS ES6 必知的十个 特性
  • (21)起落架/可伸缩相机支架
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4)Elastix图像配准:3D图像
  • (Charles)如何抓取手机http的报文
  • (C语言)共用体union的用法举例
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (七)Flink Watermark
  • (未解决)macOS matplotlib 中文是方框
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (转)iOS字体
  • (转)大道至简,职场上做人做事做管理
  • ***通过什么方式***网吧