当前位置: 首页 > 知识库问答 >
问题:

如果结构定义和默认模板参数

李森
2023-03-14

根据enable_if结构的定义:

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

std::is_integral的情况下,可以在没有指定类型T的情况下调用

这是因为推断模板参数机制吗?如果是,为什么为not专门化定义指定默认参数


共有2个答案

逄征
2023-03-14

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

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

顺便说一下,在类模板中使用enable_if来帮助消除特定参数的歧义,也使用默认参数。它看起来像模板

鲜于渊
2023-03-14

你的问题有点神秘,但据我理解:

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

>

  • 不会的;fooenable\u if模板将仅在用户需要其实例化(隐式或显式)时使用T的特定值进行实例化。因此总是指定T

    默认的模板参数仅在基本模板定义(即不是专门化)上显示。这就是为什么您只能在enable_if的第一个声明中看到它。但是,它们会影响所有专门化(基本上,如果实例化enable_if

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

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

    将只是int f()

  •  类似资料:
    • 如果允许我执行以下操作: 为什么我主要不被允许做以下事情? 但我必须具体说明以下几点: C11引入了默认的模板参数,现在我完全无法理解它们。

    • 问题内容: 我有一个模板绑定,使用Angular的日期过滤器显示名为“ date”的模型属性,该属性是一个日期。 到目前为止,一切都很好。但是,目前,如果日期字段中没有值,则绑定不显示任何内容。但是,如果没有日期,我希望显示字符串“ Various”。 我可以使用二进制运算符获取基本逻辑: 但是我无法使其与日期过滤器一起使用: 如何在日期过滤器旁边使用二元运算符? 问题答案: 原来我要做的就是将表

    • 我在IntelliJ中为setter创建了一个自定义模板。当我使用Alt Insert时,我可以选择该模板,而且效果很好。 但是,当我尝试按Alt-Enter生成缺少的setter时,它使用IntelliJ默认值。 如何使Alt Enter完成使用我的自定义模板而不是默认?

    • 是否允许在友元声明中为模板参数提供默认值? Visual Studio 2015似乎允许这样做。gcc拒绝了。我在cppreference页面上找不到任何内容。

    • 我一定错过了一些明显的东西,因为这真的让我大吃一惊。 以下代码给出了错误: 是否有理由必须实例化一个带有1个默认值的参数的模板,并为其指定一个值? 有人能引用标准吗?

    • 下面的代码是合法的C(用g-Wall编译干净): 但是,当我尝试使用nvcc编译此文件时,会出现以下错误: nvcc t.cu t.cu(39):警告:当重新声明未引用的函数模板时,指定默认参数是不标准的 t、 cu(39):警告:重新定义默认参数 t.cu(51):警告:重新声明未引用的函数模板时指定默认参数是不标准的 t、 cu(51):警告:重新定义默认参数 t、 cu(53):错误:模板实