概念库提供基础语言概念的定义,它们能用于进行模板实参的编译时校验,以及基于类型属性的函数派发。这些概念在程序中提供等式推理的基础。
标准库中的大多数概念一同加上了语法及语义要求。通常,编译器只能检查语法要求。若在使用点语义要求未得到满足,则程序为病式,不要求诊断。
类型支持(基本类型、RTTI、类型特性)
定一个类型与另一类型相同
std::same_as
template < class T, class U > | (C++20 起) |
概念 same_as<T, U>
若且唯若 T
与 U
代表同一类型才得到满足。
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