表达式 std::enable_if 中的类型 * 是什么

Whats is type* in the expression std::enable_if

谁能给我解释一下 type* 是什么意思?

我在文档中看到 std::enable_if 这个例子:

// #3, enabled via a parameter
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";
 }

这里为什么要用类型,什么是type*

谢谢!

不是type*;这是 <the member type of the whole enable_if thing>*.

enable_if 有点乱;默认情况下 type 成员只是 void,所以我们所做的一切(如果 T 是微不足道的可破坏的)是声明一个类型为 void* 的未命名模板参数,默认为0(或nullptr),我们可以完全忽略它。

我们拥有它的唯一原因是,如果 T 不是 平凡可破坏的,那么就没有这样的成员类型 type,所以destroy 的这种特殊专业化将不存在(通过 SFINAE 的魔法)。

这有点像在万圣节前绕过邻居,但随后却不接受他们的任何糖果,因为您实际上并不想要任何糖果:您只是想看看您的邻居是否在家。他们会像 "why did he/she/it do that? how weird" 但你有你的答案所以它确实是有目的的。

如果 std::is_trivially_destructible<T>::value == true 则它是指向 std::enable_if 公开的类型的指针,否则它不存在。它公开的默认类型是 void.

请记住,对于 SFINAE,我们只是试图触发替换错误,我们可以通过尝试使用 std::enable_iftypedef type 来做到这一点。如果 std::is_trivially_destructible<T>::valuefalse,则 type 将不存在,并且将跳过该函数以进行重载解析。

我们也可以指定我们自己的类型,也许这样就很清楚了:

std::enable_if<true, int>::type* intPointer;

此处,intPointer 的类型为 int*


如果没有 enable_if 的检查,它看起来有点像:

template <typename T>
struct enable_always
{
  typedef T type;
};