【问题标题】:Whats is type* in the expression std::enable_if [duplicate]表达式 std::enable_if 中的 type* 是什么 [重复]
【发布时间】:2019-05-09 13:57:24
【问题描述】:

谁能给我解释一下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* 是什么?

谢谢!

【问题讨论】:

    标签: c++ templates enable-if


    【解决方案1】:

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

    请记住,对于 SFINAE,我们只是尝试触发替换错误,我们可以通过尝试使用 std::enable_iftypedef type 来做到这一点。如果std::is_trivially_destructible&lt;T&gt;::valuefalse,那么type 将不存在,并且该函数将被跳过以解决重载问题。

    我们也可以指定我们自己的类型,也许这样会更清楚:

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

    这里,intPointer 将是 int* 类型。


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

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

    【讨论】:

      【解决方案2】:

      不是type*;这是&lt;the member type of the whole enable_if thing&gt;*

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

      我们拥有它的唯一原因是,如果T不是可以轻易破坏的,则不存在type 这样的成员类型,所以destroy 的这种特殊专业化不会' t 存在(通过 SFINAE 的魔力)。

      这有点像万圣节时绕过你的邻居,然后不接受他们的任何糖果,因为你从不真正想要任何糖果:你只是想看看你的邻居是否在家。他们会说“他/她/它为什么这样做?多么奇怪”,但你有你的答案,所以它确实是有目的的。

      【讨论】:

      • 如果你不想要糖果我就给你。
      • @SombreroChicken 对不起,甜蜜的失败不是错误:D
      猜你喜欢
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 2013-10-11
      • 1970-01-01
      • 2022-01-12
      • 2013-01-12
      • 2022-11-17
      相关资源
      最近更新 更多