C++标准模板(STL)- 概念库 (C++20) - 指定一个类型与另一类型相同 - (std::same_as)

概念库提供基础语言概念的定义,它们能用于进行模板实参的编译时校验,以及基于类型属性的函数派发。这些概念在程序中提供等式推理的基础。

标准库中的大多数概念一同加上了语法及语义要求。通常,编译器只能检查语法要求。若在使用点语义要求未得到满足,则程序为病式,不要求诊断。

类型支持(基本类型、RTTI、类型特性)

定一个类型与另一类型相同

std::same_as

template < class T, class U >
concept same_as = /* see below */;

(C++20 起)

概念 same_as<T, U> 若且唯若 TU 代表同一类型才得到满足。

std::same_as<T, U> 包含 std::same_as<U, T> ,反之亦然。

可能的实现

namespace detail
{
template< class T, class U >
concept SameHelper = std::is_same_v<T, U>;
}

template< class T, class U >
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;

调用示例 (c++11)

#include <iostream>
#include <type_traits>

class A
{
public:
    A() {}
};

class B : public A
{
public:
    B() {}
};

//自定义的实现
namespace std
{
template< class T, class U >
constexpr bool is_same_v = std::is_same<T, U>::value;

template< class T, class U >
constexpr bool same_as = ((std::is_same<T, U>::value) && (std::is_same<U, T>::value));
}

int main()
{
    std::cout << std::boolalpha;

    // 一些实现定义状况
    std::cout << "std::is_same<int, std::int32_t>::value:   "
              << std::is_same<int, std::int32_t>::value << std::endl;
    // 若 'int' 为 32 位则通常为 true
    std::cout << "std::is_same<int, std::int64_t>::value:   "
              << std::is_same<int, std::int64_t>::value << std::endl;
    // 若使用 ILP64 数据模型则可能为 true

    std::cout << "-----------------------------------------------" << std::endl;

    // 'float' 决非整数类型
    std::cout << "std::is_same<float, std::int32_t>::value: "
              << std::is_same<float, std::int32_t>::value << std::endl; // false

    std::cout << "-----------------------------------------------" << std::endl;

    // 'int' 为隐式的 'signed'
    std::cout << "std::is_same<int, int>::value:            "
              << std::is_same<int, int>::value << std::endl;        // true
    std::cout << "std::is_same<int, unsigned int>::value:   "
              << std::is_same<int, unsigned int>::value << std::endl; // false
    std::cout << "std::is_same<int, signed int>::value:     "
              << std::is_same<int, signed int>::value << std::endl; // true

    std::cout << "-----------------------------------------------" << std::endl;

    // 不同于其他类型, 'char' 既非 'unsigned' 亦非 'signed'
    std::cout << "std::is_same<char, char>::value:          "
              << std::is_same<char, char>::value << std::endl;        // true
    std::cout << "std::is_same<char, unsigned char>::value: "
              << std::is_same<char, unsigned char>::value << std::endl; // false
    std::cout << "std::is_same<char, signed char>::value:   "
              << std::is_same<char, signed char>::value << std::endl; // false

    std::cout << "-----------------------------------------------" << std::endl;

    std::cout << "std::is_same<A, A>::value:                "
              << std::is_same<A, A>::value << std::endl; // false
    std::cout << "std::is_same<A, B>::value:                "
              << std::is_same<A, B>::value << std::endl; // false
    std::cout << "std::is_same<A(), B()>::value:            "
              << std::is_same<A(), B()>::value << std::endl; // false
    std::cout << "-----------------------------------------------" << std::endl;
    std::cout << std::endl;

    // 一些实现定义状况
    std::cout << "std::same_as<int, std::int32_t>   "
              << std::same_as<int, std::int32_t> << std::endl;
    // 若 'int' 为 32 位则通常为 true
    std::cout << "std::same_as<int, std::int64_t>:   "
              << std::same_as<int, std::int64_t> << std::endl;
    // 若使用 ILP64 数据模型则可能为 true

    std::cout << "-----------------------------------------------" << std::endl;

    // 'float' 决非整数类型
    std::cout << "std::same_as<float, std::int32_t>: "
              << std::same_as<float, std::int32_t> << std::endl; // false

    std::cout << "-----------------------------------------------" << std::endl;

    // 'int' 为隐式的 'signed'
    std::cout << "std::same_as<int, int>:            "
              << std::same_as<int, int> << std::endl;        // true
    std::cout << "std::same_as<int, unsigned int>:   "
              << std::same_as<int, unsigned int> << std::endl; // false
    std::cout << "std::same_as<int, signed int>:     "
              << std::same_as<int, signed int> << std::endl; // true

    std::cout << "-----------------------------------------------" << std::endl;

    // 不同于其他类型, 'char' 既非 'unsigned' 亦非 'signed'
    std::cout << "std::same_as<char, char>:          "
              << std::same_as<char, char> << std::endl;        // true
    std::cout << "std::same_as<char, unsigned char>: "
              << std::same_as<char, unsigned char> << std::endl; // false
    std::cout << "std::same_as<char, signed char>:   "
              << std::same_as<char, signed char> << std::endl; // false

    std::cout << "-----------------------------------------------" << std::endl;

    std::cout << "std::same_as<A, A>:                "
              << std::same_as<A, A> << std::endl; // false
    std::cout << "std::same_as<A, B>:                "
              << std::same_as<A, B> << std::endl; // false
    std::cout << "std::same_as<A(), B()>:            "
              << std::same_as<A(), B()> << std::endl; // false

    return 0;
}

输出

std::is_same<int, std::int32_t>::value:   true
std::is_same<int, std::int64_t>::value:   false
-----------------------------------------------
std::is_same<float, std::int32_t>::value: false
-----------------------------------------------
std::is_same<int, int>::value:            true
std::is_same<int, unsigned int>::value:   false
std::is_same<int, signed int>::value:     true
-----------------------------------------------
std::is_same<char, char>::value:          true
std::is_same<char, unsigned char>::value: false
std::is_same<char, signed char>::value:   false
-----------------------------------------------
std::is_same<A, A>::value:                true
std::is_same<A, B>::value:                false
std::is_same<A(), B()>::value:            false
-----------------------------------------------

std::same_as<int, std::int32_t>   true
std::same_as<int, std::int64_t>:   false
-----------------------------------------------
std::same_as<float, std::int32_t>: false
-----------------------------------------------
std::same_as<int, int>:            true
std::same_as<int, unsigned int>:   false
std::same_as<int, signed int>:     true
-----------------------------------------------
std::same_as<char, char>:          true
std::same_as<char, unsigned char>: false
std::same_as<char, signed char>:   false
-----------------------------------------------
std::same_as<A, A>:                true
std::same_as<A, B>:                false
std::same_as<A(), B()>:            false

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值