【问题标题】:enable_if struct definition and default template parameterenable_if 结构定义和默认模板参数
【发布时间】:2012-11-13 13:29:02
【问题描述】:

根据 enable_if struct 的定义:

template<bool B, class T = void>
struct enable_if {};

template<class T>
struct enable_if<true, T> { typedef T type; };

我想知道如何

template<class T>
T foo(T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0) 
{
    return t;
}

特别是:

typename std::enable_if<std::is_integral<T>::value >::type

可以在没有指定类型 T 的情况下调用,以防 std::is_integral&lt;T&gt;::value 等于 true。在这种情况下,将调用 std::enable_if 的特化,并且在此定义中没有默认模板参数。

是不是因为推导模板参数机制?如果是,为什么要为非专业化定义指定默认参数?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    您的问题有点神秘,但据我了解:

    我想知道如何在没有指定类型 T 的情况下调用 ...

    1. 不会; fooenable_if 模板只会在用户需要他们的实例化(隐式或显式)T 的特定值 时被实例化。所以总是指定T

    2. 默认模板参数仅在“基本”模板定义中出现(即不是特化)。这就是为什么你只能在enable_if 的第一个声明中看到它。但是,它们会影响所有特化(基本上,如果您实例化 enable_if&lt;X&gt;,编译器会看到您没有为基本模板提供参数之一,并尝试将所有特化与参数列表 &lt;X, void&gt; 匹配)。

    顺便说一句,第二个模板参数用于从enable_if 中获取与void 不同的类型:

    std:enable_if<1, int>::type f();
    

    应该只是int f()

    【讨论】:

      【解决方案2】:

      enable_if 模板的目的是从重载集中删除 函数模板。就其本身而言,您的示例并不是非常有用,只是它将拒绝实例化具有编译器错误的非整数类型。但是,如果您还编写了第二个重载,例如使用反向条件,那么 foo(1)foo(1.0) 都只会找到一个可行的重载并且没有歧义。

      事实上,再想一想:在推导foo(1.0) 的参数时,第一个版本(你写的那个)实际上是错误的,因为没有成员类型::type。但是,这不是硬编译错误,而只是所谓的“替换失败”——这不是错误。它只是从考虑中删除了整个模板。

      作为旁注,enable_ifclass 模板中有一个相关用途,以帮助消除专业化的歧义,也使用默认参数。它看起来像template &lt;typename T, typename = typename std::enable_if&lt;some_condition&gt;::type&gt; ...

      【讨论】:

      • 我认为 OP 已经知道这一切。我相信,另一个答案中的 (2.) 段是他们想知道的。
      猜你喜欢
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      相关资源
      最近更新 更多