C++11 std::is_same和std::decay

C++11的模板类型判断——std::is_same和std::decay

问题提出:

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

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

这里就需要用到C++11的type_traits头文件了,type_traits头文件定义了很多类型检查相关的方法,上面的例子具体用到了其中两个结构

std::is_same 判断类型是否一致

bool isInt = std::is_same<int, int>::value; //为true

下面是官方的例子:

#include <iostream>
#include <type_traits>
#include <cstdint>

void print_separator()
{
          
   
    std::cout << "-----
";
}

int main()
{
          
   
    std::cout << std::boolalpha;

    std::cout << std::is_same<int, int32_t>::value << 
;   // true
    std::cout << std::is_same<int, int64_t>::value << 
;   // false
    std::cout << std::is_same<float, int32_t>::value << 
; // false

    print_separator();

    std::cout << std::is_same<int, int>::value << "
";          // true
    std::cout << std::is_same<int, unsigned int>::value << "
"; // false
    std::cout << std::is_same<int, signed int>::value << "
";   // true

    print_separator();

    // unlike other types char is not unsigned and not signed
    std::cout << std::is_same<char, char>::value << "
";          // true
    std::cout << std::is_same<char, unsigned char>::value << "
"; // false
    std::cout << std::is_same<char, signed char>::value << "
";   // false
}

通过std::is_same即可判断两个类型是否一样,特别在模板里面,在不清楚模板的参数时,此功能可以对一些特定的参数类型进行特殊的处理(如结合enable_if)。

回到正文,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
    {
          
   
        //.........
    }
}

参考

经验分享 程序员 微信小程序 职场和发展