目录
基本概念以及用法
std::is_same - cppreference.com
头文件:#include <type_traits>
std::is_same是一个类!
eg.
#pragma once
#include <iostream>
#include <type_traits>
int main() {
//bool bVar = std::is_same<int, float>::value;
std::cout<< std::is_same<int, float>::value<<std::endl;//0
std::cout << std::is_same<int, int>::value << std::endl;//1
std::cout << std::is_same<int, signed int>::value << std::endl;//1
std::cout << std::is_same<int, unsigned int>::value << std::endl;//0
/*
char既不是unsigned char也不是signed char,char就是char,这和int是signed int的缩写是不一样的,
char的表达范围可能等同于signed char,也可能等同于unsigned char,取决于编译器,一般是等同于signed char,
但这个仅仅是范围等同,就像32位上int和long范围是一样的,但不是同一个类型。因为用途不同,char用于表达字符,
理论上不应该关心其正负的实现,而signed char 和 unsigned char 用于表达数值,或可移植的char。
*/
std::cout << std::is_same<char, char>::value << std::endl; //1
std::cout << std::is_same<char, signed char>::value << std::endl;//0
std::cout << std::is_same<char, unsigned char>::value << std::endl;//0
std::cout << std::is_same<int, std::int32_t>::value << '\n';//1
std::cout << std::is_same<int, std::int64_t>::value << '\n';//0
//std::is_same对int和const int\int &\const int&等都是区别对待的
std::cout << std::is_same<int, const int>::value << '\n';//0
std::cout << std::is_same<int, int&>::value << '\n';//0
std::cout << std::is_same<int, const int&>::value << '\n';//0
}
实现源码
template<typename _Tp, _Tp __v>
struct integral_constant
{
static const _Tp value = __v;
typedef _Tp value_type;
typedef integral_constant<_Tp, __v> type;
};
/// typedef for true_type
typedef integral_constant<bool, true> true_type;
/// typedef for false_type
typedef integral_constant<bool, false> false_type;
template<typename, typename>
struct is_same
: public false_type { };
template<typename _Tp>
struct is_same<_Tp, _Tp>
: public true_type { };
type_traits source code [libstdc++-v3/include/std/type_traits] - Woboq Code Browser
1. is_same是模版,integral_constant也是模版
2. true_type和false_type是integral_constant实例化的类型
3. is_same通用的模版继承了false_type
4. is_same的偏特化模版继承了true_type
5. is_same模版实参类型一致时,会实例化偏特化模版,而偏特化模版继承了true_type
6. integral_constant<bool, true> 即truetype的value是true
关于c++模板的特化:C++ 模板特化_Peace-CSDN博客
更简洁的方式:
template<typename T1, typename T2>
struct is_same_{
const static bool value = false;
};
// 个数偏特化
template<typename T1> // 只指定了一部分参数,剩下的未指定的需在参数列表中,否则报错
struct is_same_<T1, T1>{
const static bool value = true;
};
int main() {
std::cout << "Test template" << std::endl;
std::cout << "bool vs int =" <<is_same_<bool, int>::value << std::endl;
std::cout << "int vs int =" <<is_same_<int, int>::value << std::endl;
std::cout << "unsigned int vs int =" <<is_same_<unsigned int, int>::value << std::endl;
return 0;
}
output:
Ref:
C++11 type_traits 之is_same源码分析_banliu8076的博客-CSDN博客 - good
C++11的std::is_same和std::decay使用与源码解析_彼方的博客-CSDN博客
C++11 type_traits 之is_same源码分析 - RonTang - 博客园
c++ - Why does same_as concept check type equality twice? - Stack Overflow