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

bla*_*zio 1 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";
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 为什么在enable_if只是条件而没有指示第二个模板参数?
  2. 什么类型的"类型*"呢?无效*?如果是这样,为什么?
  3. 为什么是指针?

Som*_*ken 5

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

因为默认void就好了.

什么类型的"类型*"呢?无效*?如果是这样,为什么?

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

为什么是指针?

所以我们可以很容易地给它一个默认值0.


我们所使用std::enable_if的只是检查某些属性(在这种情况下检查是否T可以轻易破坏),如果这些属性导致false我们使用它来创建格式错误的代码,从而从过载解决中消除此功能.

如果std::is_trivially_destructible<T>::value == false那时::type不存在,那么代码就会形成错误.在SFINAE中,这很方便,因为这种过载将不会被考虑用于解决.