美文网首页
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