c++ 11 STL之is_same

27 篇文章 2 订阅

目录

基本概念以及用法

实现源码

更简洁的方式:


基本概念以及用法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

First Snowflakes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值