我在查看时遇到了这个例子std::enable_if:
template<class T,
typename = std::enable_if_t<std::is_array<T>::value> >
void destroy(T* t)
{
for(std::size_t i = 0; i < std::extent<T>::value; ++i) {
destroy((*t)[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
在模板参数列表中,您可以放置非模板化的类/结构。所以当我们删除typename =. 这段代码中的 是什么typename =意思和作用?
第二个模板参数typename指示该参数是类型而不是常量值。该参数未指定名称,但=如果调用者未指定类型,则表明它具有默认类型。enable_if_t<...>在本例中,该类型是(aka )的结果std::enable_if<...>::type。
std::enable_if有 2 个模板参数。第一个参数采用布尔常量,第二个参数指定成员的类型std::enable_if<...>::type。第二个参数是void默认的。type仅当布尔值为 true 时该成员才被定义,否则当布尔值为 false 时该成员未定义。在本例中,该布尔值是 的结果std::is_array<T>::value。
因此,如果T是数组类型,std::is_array<T>::value则 will be true,因此std::enable_if<true, void>::typewill be void,最终模板将是:
template<class T, typename _ = void>
void destroy(T* t)
{
...
}
Run Code Online (Sandbox Code Playgroud)
否则, ifT不是数组类型,std::is_array<T>::valuewill be false,因此std::enable_if<false, void>::type将是未定义的,最终的模板将是:
template<class T, typename _ = [undefined] >
void destroy(T* t)
{
...
}
Run Code Online (Sandbox Code Playgroud)
因此该模板将被禁用,因为它是无效的。