is_same
template< class T, class U >
struct is_same;
如果T与U具有同一const-volatile
限定的相同类型,则is_same<T,U>::value
为true,否则为false。
使用示例
#include<iostream>
#include<type_traits>
using namespace std;
int main()
{
cout<<boolalpha;
cout<<is_same<int,int>::value<<endl;
cout<<is_same<int,double>::value<<endl;
}
输出为
true
false
可能的实现
template<class T, class U> //0
struct is_same : std::false_type {};
template<class T> //1
struct is_same<T, T> : std::true_type {};
首先定义了一个类模板is_same
,这个类模板有两个模板参数T和U。接着针对这个类模板T和U类型相同的情况进行偏特化。所以,当T和U为同一种类型时,将匹配到1,不同则匹配到0。两个版本唯一的不同是父类。
父类的定义:
using true_type=std::integral_constant<bool, true>
using false_type=std::integral_constant<bool, false>
可见true_type
和false_type
是类模板std::integral_constant
实例化的结果。
std::integral_constant
可能的定义:
template<class T, T v>
struct integral_constant {
static constexpr T value = v;
typedef T value_type;
typedef integral_constant type; // 使用注入的类名
constexpr operator value_type() const noexcept { return value; }
constexpr value_type operator()() const noexcept { return value; } // c++14 起
};
由代码可见,std::integral_constant
包装了特定类型T的静态常量,且值为v。
所以true_type
和false_type
为包含一个静态bool成员的类。值分别为true和false。
再以上面的代码为例
当T,U都为int时,匹配到1,此时is_same
类继承了true_type
,该类包含一个静态bool对象value=true。
当T,U分别为int,double时,is_same
类继承了false_type
,该类同true_type
只不过value=false。