请支持原创~~
头文件
#include <type_traits>
声明
//since c++11
template <class T, class U> struct is_same;
//since c++17
template <class T, class U> inline constexpr bool is_same_v = is_same<T, U>::value;
is_same 是在c++11 中发布的,在c++17 中发布了is_same_v用以标记is_same的value值。
实现
template <class _Tp, class _Up> struct is_same : public false_type {};
template <class _Tp> struct is_same<_Tp, _Tp> : public true_type {};
从定义来看is_same 继承自false_type 或 true_type:
template <class T, T v> struct integral_constant;
typedef integral_constant<bool, true> true_type; // C++11
typedef integral_constant<bool, false> false_type; // C++11
template <bool B> // C++14
using bool_constant = integral_constant<bool, B>; // C++14
typedef bool_constant<true> true_type; // C++14
typedef bool_constant<false> false_type; // C++14
从头文件中看到在c++14 发布了boo_constant 用以指定特殊的bool 类型的integral_constant,但是cppreference 中却说是c++17发布的,这个因为找不到c++17 发布的官方文档,无法核实。
本人结合代码上下文,认为是c++14 发布的,不过目前的编译器应该都能支持到c++17了,所以,都能直接使用了。
integral_constant
integral_constant 是trype traits 的基类,实现大致如下:
template<class T, T v>
struct integral_constant {
static constexpr T value = v;
using value_type = T;
using type = integral_constant; // using injected-class-name
constexpr operator value_type() const noexcept { return value; }
constexpr value_type operator()() const noexcept { return value; } // since c++14
};
- 成员变量value,是一个public static const 类型
- 运算符value_type重载,用以返回value
- 运算符()重载,c++14 发布,用以返回value
总结
- 结合integral_constant,is_same<T, U> 是用以确认类型T和U 是否是统一类型,is_same 是比较严格的类型比对,包含了const和volatile 属性;
- 结合integral_constant,is_same 是T 为bool 的特殊类,所以operator 实现的是bool 的重载,用以返回value 的值;
- is_same用以确认类型是否相同,所以,is_same<T, U> 和 is_same<U, T>返回值应该是相同的;
举例
#include <iostream>
#include <type_traits>
#include <cstdint>
typedef int integer_type;
struct A { int x,y; };
struct B { int x,y; };
typedef A C;
int main() {
std::cout << std::boolalpha;
std::cout << "is_same:" << std::endl;
std::cout << "int, const int: " << std::is_same<int, const int>::value << std::endl;
std::cout << "int, integer_type: " << std::is_same<int, integer_type>::value << std::endl;
std::cout << "A, B: " << std::is_same<A,B>::value << std::endl;
std::cout << "A, C: " << std::is_same<A,C>::value << std::endl;
std::cout << "signed char, std::int8_t: " << std::is_same<signed char,std::int8_t>::value << std::endl;
std::cout << "char, signed char: " << std::is_same<char, signed char>::value << std::endl;
std::cout << "char, unsigned char: " << std::is_same<char, unsigned char>::value << std::endl;
return 0;
}
运行结果:
is_same:
int, const int: false
int, integer_type: true
A, B: false
A, C: true
signed char, std::int8_t: true
char, signed char: false
char, unsigned char: false
- int 和const int 对于is_same 来说不是一个类型,可以使用decay 将const 退化掉;
- 即使struct 内容一样的A和B 也不是一个类型;
- char 既不是signed char,也不是unsigned char;