介绍
std::enable_if_t<cond, T>
引入较短形式的主要原因std::enable_if<cond, T>::type
是不要仅仅计算4 个字符。
由于std::enable_if
和其他同类类型特征主要用于依赖上下文中,因此当(B)就足够了时,不得不编写(A)是非常痛苦的:
例子
template<class T, class = typename std::enable_if<cond, T>::type> // (A)
struct A;
template<class T, class = std::enable_if_t<cond, T>> // (B)
struct A;
从属名称
我们需要typename之前,std::enable_if
因为::type
它是一个从属名称,如果没有它,标准规定表达式应该被解析为好像::type
实际上是一个值。
std::is_same<T, U>::value
确实是一个值,所以不需要使用typename;这反过来意味着我们实际上只剃掉了 4 个字符……仅此而已。
延伸阅读
那么,为什么没有std::is_same的变量模板?
只是因为没有那么大的需求,所以没有人及时提出增加;因为大多数人对以下替代方案感到满意:
std::is_same<T, U> {} == std::is_same<T, U>::value
std::is_same<T, U> () == std::is_same<T, U>::value
延伸阅读
有一个提案,由Stephan T. Lavavej编写,为合适的type-traits添加变量模板。