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 标准支持的不好。
网友评论