c++11 std::is_same 源码剖析

写在最前。。。

 

请支持原创~~ 

 

头文件

#include 

声明

//since c++11

template  struct is_same;

//since c++17

template  inline constexpr bool is_same_v = is_same::value; 

 is_same 是在c++11 中发布的,在c++17 中发布了is_same_v用以标记is_same的value值。

实现

template  struct is_same : public false_type {};
template             struct is_same<_Tp, _Tp> : public true_type {};

从定义来看is_same 继承自false_type 或 true_type:

template  struct integral_constant;
typedef integral_constant  true_type;   // C++11
typedef integral_constant false_type;  // C++11template                                    // C++14
using bool_constant = integral_constant;   // C++14
typedef bool_constant true_type;              // C++14
typedef bool_constant 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
struct integral_constant {static constexpr T value = v;using value_type = T;using type = integral_constant; // using injected-class-nameconstexpr 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 是否是统一类型,is_same 是比较严格的类型比对,包含了const和volatile 属性;
  • 结合integral_constant,is_same 是T 为bool 的特殊类,所以operator 实现的是bool 的重载,用以返回value 的值;
  • is_same用以确认类型是否相同,所以,is_same 和 is_same返回值应该是相同的;

举例

#include 
#include 
#include 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::value << std::endl;std::cout << "int, integer_type: " << std::is_same::value << std::endl;std::cout << "A, B: " << std::is_same::value << std::endl;std::cout << "A, C: " << std::is_same::value << std::endl;std::cout << "signed char, std::int8_t: " << std::is_same::value << std::endl;std::cout << "char, signed char: " << std::is_same::value << std::endl;std::cout << "char, unsigned char: " << std::is_same::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;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部