通过参数启用时std :: enabled_if如何工作

时间:2018-08-10 11:18:54

标签: c++ templates metaprogramming enable-if

我试图了解enable_if的工作原理,并且我几乎了解了

中除了方案3之外的所有内容

https://en.cppreference.com/w/cpp/types/enable_if

template<class T>
void destroy(T* t, 
         typename 
std::enable_if<std::is_trivially_destructible<T>::value>::type* = 0) 
{
    std::cout << "destroying trivially destructible T\n";
}

如果enable_if中的表达式为true,则选择部分模板特殊化,因此如果选择:

  1. 为什么在enable_if中只有条件而不指示第二个模板参数?
  2. 那么“ type *”是什么类型?无效*?如果是这样,为什么?
  3. 为什么是指针?

1 个答案:

答案 0 :(得分:5)

  

为什么在enable_if中只有条件而不指示第二个模板   参数?

因为默认的void就可以了。

  

那么“ type *”是什么类型?无效*?如果是这样,为什么?

是的,如果::typevoid将是std::is_trivially_destructible<T>::value == true类型,这将导致::type*-> void*

  

为什么是指针?

因此,我们可以轻松为其设置默认值0


我们使用std::enable_if的目的是检查某些属性(在这种情况下,检查T是否可微毁),如果这些结果导致false,那么我们将其用于创建格式错误的代码,从而从重载解析中消除此功能。

如果std::is_trivially_destructible<T>::value == false::type将不存在,因此代码格式错误。在SFINAE中,这很方便,因为将不考虑此重载以进行解决。