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_type | bool |
| type | std::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
-----------------------------------------------
相关推荐
handler0116 分钟前
【算法】并查集(普通/扩展/带权)模板与例题
数据结构·c++·笔记·算法·c·图论·查并集
知识的宝藏28 分钟前
Xpaht self::div 轴语法
开发语言
keykey6.29 分钟前
卷积神经网络(CNN):让AI学会“看“
开发语言·人工智能·深度学习·机器学习
IsJunJianXin32 分钟前
谷歌搜索cookie NID逆向生成
开发语言·python·google搜索·sgss·nid-cookie·算法生成nid·google-cookie
weikecms41 分钟前
美团霸王餐报名API接口
java·开发语言
繁星蓝雨1 小时前
C++中对比pragma once和ifndef的使用区别
开发语言·c++·ifndef·头文件·pragma once
.千余1 小时前
【C++】C++手写Vector容器:从底层源码模拟实现
开发语言·c++·经验分享·笔记·学习
a诠释淡然1 小时前
C++ vs Rust:哪个更适合你的下一个项目?
开发语言·c++·rust
meilindehuzi_a1 小时前
深入理解 JavaScript 执行机制:从编译阶段到调用栈底层实现
开发语言·javascript·ecmascript
小小de风呀1 小时前
de风——【从零开始学C++】(十二):stack和queue的基本使用和模拟实现
开发语言·c++