美文网首页
std::enable_if_t 相关问题

std::enable_if_t 相关问题

作者: 指尖叹 | 来源:发表于2018-12-06 14:11 被阅读0次

    std::enable_if_t 是C++14 才支持的写法, C++11 为std::enable_if
    std::enable_if 大概实现如下:

    template<bool B, class T = void>
    struct enable_if {};
    
    template<class T>
    struct enable_if<true, T> { typedef T type; };
    

    当 enable_if 的条件为true 时,优先匹配 struct enable_if<true,T> 这个模板,因此会多一个 type 类型, 和T 保持一致。
    std::enable_if_t 大概实现如下:

    template< bool B, class T = void >
    using enable_if_t = typename enable_if<B,T>::type;
    

    也就是说, enable_if_t 只是using enable_if 的type 。

    二者用法示例

    #include <iostream>
    #include <type_traits>
    
    template<typename EnumT , typename std::enable_if<std::is_enum<EnumT>::value>::type * = nullptr>
    void  func(EnumT e1, EnumT e2 ){}
    
    template<typename InterT , typename std::enable_if<std::is_Integral<InterT>::value>::type * = nullptr>
    void  func(InterT i1, InterT i2 ){}
    
    
    template<typename EnumT , typename std::enable_if_t<std::is_enum<EnumT>::value> * = nullptr>
    void  foo(EnumT e1, EnumT e2 ){}
    
    template<typename InterT , typename std::enable_if_t<std::is_integral<InterT>::value> * = nullptr>
    void  foo(InterT i1, InterT i2 ){}
    
    int main()
    {
        func(1 , 4);
        foo(4,1);
         return 0;
    }
    

    constexpr 表达式,定义函数时, 函数体中不可以有变量, 这个c++11的规定,但c++14 取消了这个限制,更加灵活了。示例:

    constexpr int Foo(int a, int b){
        int i = 3;
        return i+a+b;
    }
    

    g++ --std=c++11 编译, 报错: error: body of constexpr function ...... not a return-statement

    注: GNU 4.9.3 版本,对c++14 标准支持的不是很好, 不支持constexpr 扩展。
    GNU4.8.5 版本对C++11 标准支持的不好。

    相关文章

      网友评论

          本文标题:std::enable_if_t 相关问题

          本文链接:https://www.haomeiwen.com/subject/pxxaqqtx.html