c++11::std::is_same/decay

 

#include <type_traits>
std::is_same 判断类型是否一致
通过std::is_same即可判断两个类型是否一样,特别在模板里面,在不清楚模板的参数时,此功能可以对一些特定的参数类型进行特殊的处理。

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
    {
        //.........
    }
}

 

std::is_same的判断是很严格的!
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<int, const int>::value << std::endl;//false
    std::cout << "int, int&: " << std::is_same<int, int&>::value << std::endl;//false

    std::cout << "int, const int&: " << std::is_same<int, const int&>::value << std::endl;//false
    std::cout << "int, integer_type: " << std::is_same<int, integer_type>::value << std::endl;//true

    std::cout << "A, B: " << std::is_same<A, B>::value << std::endl;//false
    std::cout << "A, C: " << std::is_same<A, C>::value << std::endl;//true

    std::cout << "signed char, std::int8_t: " << std::is_same<signed char, std::int8_t>::value << std::endl;//true
    system("pause");
}

 

std::decay 退化类型的修饰。
各种引用的修饰去掉,把cosnt int&退化为int,这样就能通过std::is_same正确识别出加了引用的类型了 
#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'         //true
            << decay_equiv<int&, int>::value << '\n'        //true
            << decay_equiv<int&&, int>::value << '\n'        //true
            << decay_equiv<const int&, int>::value << '\n'    //true
            << decay_equiv<int[2], int*>::value << '\n'        //true
            << decay_equiv<int(int), int(*)(int)>::value << '\n';    //true
}

 

posted @ 2019-06-24 16:00  osbreak  阅读(1036)  评论(0编辑  收藏  举报