C++11: enable_if

首先了解一个概念:SFINAE : substitution failure is not an error, 替代失败不是错误

template<typename T>
typename std::enable_if<sizeof(T) > 4>::type
foo()
{
    
}

std::enable_if<>会计算作为第一个模板参数传递的给定编译时表达式

如果expression为true, 则std::enable_if<>::type得到一个类型:

  • 如果enable_if只有一个模板参数, 则type成员得到的类型是void
  • 否则, type成员得到的类型是第二个模板参数的类型

如果expression为false, type成员未定义. 由于模板的一个功能叫做SRINAE,
就会使这个带有enable_if表达式的模板函数在匹配时被忽略.

C++14开始, 可以用 _t的后缀版本来简写::type

template<typename T>
std::enable_if_t<sizeof(T) > 4>
foo
{
    
}
template<typename T>
std::enable_if_t<sizeof(T) > 4, T>
foo
{
    
}

在template和函数名之间写这个会显得很笨拙, 因此, 一般都会选择带有默认值的附加函数模板参数:

template<typename T, 
    typename = std::enable_if<sizeof(T) > 4>::type>
void foo()
{
}

如果表达式为true, 会扩展为:

template<typename T, 
    typename = void>
void foo()
{
}

还可以用using来简写:

template<typename T>
using EnableIfSizeGreater4 = std::enable_if<sizeof(T) > 4>::type;

template<typename T, typename = EnableIfSizeGreater4<T>>
void foo
{
}

你可能感兴趣的:(C++)