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
    }
  • 相关阅读:
    如何快速定位到DBGrid的某一行!!!急...
    说说设计模式~单件模式(Singleton)
    EF架构~终于自己架构了一个相对完整的EF方案
    .Net——实现IConfigurationSectionHandler接口定义处理程序处理自定义节点
    在LINQ中实现多条件联合主键LEFT JOIN
    从LINQ开始之LINQ to Objects(上)
    WPF控件模板和数据模板
    WPF的ListView控件自定义布局用法实例
    初步探讨WPF的ListView控件(涉及模板、查找子控件)
    LINQ技巧:如何通过多次调用GroupBy实现分组嵌套
  • 原文地址:https://www.cnblogs.com/osbreak/p/11077604.html
Copyright © 2011-2022 走看看