• C++ is_same


    is_same

    template< class T, class U >
    struct is_same;
    

    如果T与U具有同一const-volatile限定的相同类型,则is_same<T,U>::value为true,否则为false。

    使用示例

    #include<iostream>
    #include<type_traits>
    using namespace std;
    int main()
    {
        cout<<boolalpha;
        cout<<is_same<int,int>::value<<endl;
        cout<<is_same<int,double>::value<<endl;
    }
    

    输出为

    true
    false
    

    可能的实现

    template<class T, class U> //0
    struct is_same : std::false_type {};
     
    template<class T> //1
    struct is_same<T, T> : std::true_type {};
    

    首先定义了一个类模板is_same,这个类模板有两个模板参数T和U。接着针对这个类模板T和U类型相同的情况进行偏特化。所以,当T和U为同一种类型时,将匹配到1,不同则匹配到0。两个版本唯一的不同是父类。

    父类的定义:

    using true_type=std::integral_constant<bool, true>
    using false_type=std::integral_constant<bool, false>
    

    可见true_typefalse_type是类模板std::integral_constant实例化的结果。

    std::integral_constant可能的定义:

    template<class T, T v>
    struct integral_constant {
        static constexpr T value = v;
        typedef T value_type;
        typedef integral_constant type; // 使用注入的类名
        constexpr operator value_type() const noexcept { return value; }
        constexpr value_type operator()() const noexcept { return value; } // c++14 起
    };
    

    由代码可见,std::integral_constant包装了特定类型T的静态常量,且值为v。

    所以true_typefalse_type为包含一个静态bool成员的类。值分别为true和false。

    再以上面的代码为例

    当T,U都为int时,匹配到1,此时is_same类继承了true_type,该类包含一个静态bool对象value=true。
    当T,U分别为int,double时,is_same类继承了false_type,该类同true_type只不过value=false。

    参考

    http://zh.cppreference.com/w/cpp/types/is_same

  • 相关阅读:
    ie7不支持inline-block
    使padding的值不影响整体块的大小
    网页在不同屏幕下的自适应
    CSS:line-height:行高
    用css制作三角形,理解
    js之setTimeOut();
    jQuery:has()和jQuery:contains()区别
    前端开发之jQuary--可见筛选选择器
    python基础知识--10Lambda匿名函数、三元表达式及map、reduce、filter
    python基础知识--9迭代器生成器闭包与装饰器
  • 原文地址:https://www.cnblogs.com/cknightx/p/7642217.html
Copyright © 2020-2023  润新知