一、背景

有一个模板函数,函数在处理int型和double型时需要进行特殊的处理,那么怎么在编译期知道传入的参数的数据类型是int型还是double型呢?

#include <iostream>
template<typename T>void typeCheck(T data)
{// check data type//std::cout<< out put the type
}

二、std::is_same

<type_traits>头文件中提供了C++ STL的std::is_same模板。 C++ STL的std::is_same模板用于检查类型A是否与类型B相同。如果两者相同,则返回布尔值true,否则返回false。

模板类型

template <class A, class B>
struct is_sametemplate <class A, class B>
inline constexpr bool is_same_v= is_same<A, B>::value

用法

std::is_same<A, B>::value

实例

#include <iostream>
#include <type_traits>
#include <cstdint>int main()
{//使bool型变量按照false、true的格式输出。//如不使用该标识符,那么结果会按照1、0的格式输出。std::cout << std::boolalpha;// usually true if 'int' is 32 bitstd::cout << std::is_same<int, std::int32_t>::value << ' '; // ~ truestd::cout << std::is_same<int, std::int64_t>::value << ' '; // ~ false// same tests as above, except using C++17's `std::is_same_v<T, U>` formatstd::cout << std::is_same_v<int, std::int32_t> << ' ';  // ~ truestd::cout << std::is_same_v<int, std::int64_t> << '\n'; // ~ false// compare the types of a couple variableslong double num1 = 1.0;long double num2 = 2.0;std::cout << std::is_same_v<decltype(num1), decltype(num2)> << '\n'; // true// 'float' is never an integral typestd::cout << std::is_same<float, std::int32_t>::value << '\n'; // false// 'int' is implicitly 'signed'std::cout << std::is_same<int, int>::value << ' ';          // truestd::cout << std::is_same<int, unsigned int>::value << ' '; // falsestd::cout << std::is_same<int, signed int>::value << '\n';  // truesystem("pause");return 0;}

打印

四、新的问题

std::is_same可以判断两种类似是否一样,那么用在模板里就是利器了,比如直接在编译的时候判断类型

#include <iostream>
template<typename TYPE>
typeCheck(TYPE data)
{if(std::is_same<TYPE,int>::value){std::cout<<"int type";//do something int }else{//.........}
}

让我们试一试

// is_same example
#include <iostream>
#include <type_traits>
#include <cstdint>typedef int integer_type;struct A { int x;int y;
};struct B {
int x;
int 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;//falsestd::cout << "int, int&: " << std::is_same<int, int&>::value << std::endl;//falsestd::cout << "int, const int&: " << std::is_same<int, const int&>::value << std::endl;//falsestd::cout << "int, integer_type: " << std::is_same<int, integer_type>::value << std::endl;//truestd::cout << "A, B: " << std::is_same<A,B>::value << std::endl;//falsestd::cout << "A, C: " << std::is_same<A,C>::value << std::endl;//truestd::cout << "signed char, std::int8_t: " << std::is_same<signed char,std::int8_t>::value << std::endl;//truereturn 0;
}

打印

发现std::is_same的判断是很严格的.std::is_same对int和const int\int &\const int&等都是区别对待的,但在写模板函数时,经常会强制指定常引用进行传参,以免进行数据拷贝,这时候is_same就做出了不相等的判断,但是有时候其实我们还是希望TYPE和const TYPE& 是能认为是一样的,这时就需要std::decay进行退化处理。

四、std::decay

C++11提供了一个模板类,来为我们移除类型中的一些特性,比如引用、常量、volatile,但是注意不包括指针特性。std::decay 对一个类型进行退化处理,它的实现如下

template< class T >
struct decay {
private:typedef typename std::remove_reference<T>::type U;
public:typedef typename std::conditional< std::is_array<U>::value,typename std::remove_extent<U>::type*,typename std::conditional< std::is_function<U>::value,typename std::add_pointer<U>::type,typename std::remove_cv<U>::type>::type>::type type;
};

实例

#include <iostream>
#include <type_traits>template <typename T, typename U>
struct decay_equiv : std::is_same<typename std::decay<T>::type, U>::type
{};int main()
{std::cout << std::boolalpha<< decay_equiv<int, int>::value << '\n'<< decay_equiv<int&, int>::value << '\n'<< decay_equiv<int&&, int>::value << '\n'<< decay_equiv<const int&, int>::value << '\n'<< decay_equiv<int[2], int*>::value << '\n'<< decay_equiv<int(int), int(*)(int)>::value << '\n';return 0;
}

打印

参考:

C++11的模板类型判断——std::is_same和std::decay_尘中远的博客-CSDN博客_std::decay

std::is_same - cppreference.com

std::decay - cppreference.com

【C++11】C++类型完全退化(拓展std::decay的功能)_几罗星人的博客-CSDN博客_std::decay

C++的std::is_same与std::decay相关推荐

  1. 【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程

    C++ 元模版编程:用std::integral_constant和std::is_*系列深入理解模板元编程 一.模板元编程与类型特性 (Template Metaprogramming and Ty ...

  2. 【C++ 泛型编程 入门篇】C++元模版中std::remove_reference_t和std::remove_cv_t的运用

    目录标题 1. std::remove_reference_t和std::remove_cv_t简介 1.1 函数原型及基本解释 1.2 在C++11, C++14, C++17, C++20中的表现 ...

  3. C++多线程:异步操作std::async和std::promise

    文章目录 std::async 简介 使用案例 std::promise 简介 成员函数 总结 之前的文章中提到了C++多线程中的异步操作机制 C++ 多线程:future 异步访问类(线程之间安全便 ...

  4. C++中std::reverse和std::reverse_copy的使用

    std::reverse:反转排序容器内指定范围中的元素. std::reverse_copy与std::reverse唯一的区别是:reverse_copy会将结果拷贝到另外一个容器中,而不影响原容 ...

  5. C++中std::function和std::bind

    1.可调用对象 可调用对象有一下几种定义: 是一个函数指针,参考 C++ 函数指针和函数类型: 是一个具有operator()成员函数的类的对象: 可被转换成函数指针的类对象: 一个类成员函数指针: ...

  6. c语言stoi函数源码,一系列相关函数的通用函数(例如std::stoi,std::stof,std::stod等)...

    我想为std :: stoi,std :: stof,std :: stod等做一个通用函数..就像: // std::string -> int std::string str = " ...

  7. 【c++】4.std::shared_ptr、std::make_shared、 .get() 、.data()、void *p 的用法、裸指针

    std::shared_ptr.std::make_shared. .get() ..data().void *p 的用法.裸指针 (1)shared_ptr能够记录对象被引用的次数,主要被用来管理动 ...

  8. class std::vectorclass std::basic_stringchar,struct std::char_traitschar,class std::allocatorch

    问题描述 今天用vs编译C++代码时碰到了如下错误: 报错信息: 错误 LNK2005 class std::vector<class std::basic_string<char,str ...

  9. C++11 std::bind 和 std::placeholder

    @time 2019-07-07 @author Ruo_Xiao std::bind 则是用来绑定函数调用的参数的, 它解决的需求是我们有时候可能并不一定能够一次性获得调用某个函数的全部参数,通过这 ...

最新文章

  1. SAP常用BASIS技巧整理
  2. 【Android NDK 开发】JNI 引用 ( 弱全局引用 | NewWeakGlobalRef | DeleteWeakGlobalRef )
  3. Redis进阶-分布式存储 Sequential partitioning Hash partitioning
  4. c语言的运算符表格,C语言教案(运算符和表格达式).ppt
  5. GStreamer(二)
  6. OpenCV imwrite
  7. 11个非常漂亮动物为主题的高品质图标集
  8. java中412是什么错_HTTP 412 错误 – 先决条件失败 (Precondition failed)
  9. linux获取windows的主机名,获取网络许可主机名和主机 ID 的步骤
  10. dumpbin.exe
  11. java的mime类型_MIME类型大全
  12. 一文读懂声纹采集、声纹识别、声纹数据库系统等声纹识别技术在公安业务领域的应用场景
  13. android设计个人简历页面_Android程序员个人简历模板下载(Word格式)
  14. Perl-LWP文档
  15. re的剩余模块和subprocess模块
  16. 启用计算机的无线同屏,Windows10如何使用无线同屏功能?
  17. 卡尔曼滤波系列——(一)标准卡尔曼滤波
  18. 【第89期】推荐几本电商必读书
  19. 2023年PMP 续证的费用和流程最全介绍
  20. 【总结】访问一个网页的全过程

热门文章

  1. 计算机教学学期小结,学年第一学期信息技术教学工作总结
  2. 2018 “百度之星”程序设计大赛 - 初赛(A)
  3. abs传感器电压有几伏电_汽车ABS转速传感器工作电压测量方法
  4. 软件设计师:06-程序设计语言与语言处理程序基础
  5. 招行193亿港元收购永隆银行53.1%股份
  6. linux下PS1、PS2、PS3、PS4最全详解
  7. vostro3070装win7_戴尔Vostro 成就 3070台式机装win7系统及bios设置
  8. 二进制与或非逻辑计算机,深度学习(1):给感知机做准备,谈谈二进制和与或非门。...
  9. Autodesk系列软件(如AutoCAD、Alias、VRED)许可不够
  10. 1090 Highest Price in Supply Chain