zoukankan      html  css  js  c++  java
  • 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 << '
    '         //true
                << decay_equiv<int&, int>::value << '
    '        //true
                << decay_equiv<int&&, int>::value << '
    '        //true
                << decay_equiv<const int&, int>::value << '
    '    //true
                << decay_equiv<int[2], int*>::value << '
    '        //true
                << decay_equiv<int(int), int(*)(int)>::value << '
    ';    //true
    }
  • 相关阅读:
    设计模式-抽象工厂
    设计模式-工厂方法
    设计模式-简单工厂
    设计模式-单例模式
    设计模式使用指南
    适合Java程序员看的UML学习手册
    第六周 Java8新特性
    deepin15.11系统使用罗技k380键盘
    动态规划系列之六01背包问题
    《比勤奋更重要的是底层思维》
  • 原文地址:https://www.cnblogs.com/osbreak/p/11077604.html
Copyright © 2011-2022 走看看