[英]enable_if struct definition and default template parameter
根据 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
可以在没有指定类型 T 的情况下调用,以防std::is_integral<T>::value
等于true
。 在这种情况下,将调用 std::enable_if 的特化,并且在此定义中没有默认模板参数。
是因为推断模板参数机制吗? 如果是,为什么为非专业化定义指定默认参数?
你的问题有点神秘,但据我了解:
我想知道如何在没有指定类型 T 的情况下调用
...
它不会; foo
和enable_if
模板仅在用户需要使用T
特定值进行实例化(隐式或显式)时才会实例化。 所以T
总是被指定。
默认模板参数仅在“基本”模板定义(即非专业化)中具有特色。 这就是为什么您只能在enable_if
的第一个声明中看到它。 但是,它们会影响所有特化(基本上,如果您实例化enable_if<X>
,编译器会发现您没有提供基本模板的参数之一,并尝试将所有特化与参数列表<X, void>
匹配)。
顺便说一句,第二个模板参数用于从enable_if
与void
不同的类型:
std:enable_if<1, int>::type f();
将只是int f()
。
enable_if
模板的目的是从重载集中删除函数模板。 就其本身而言,您的示例并不是非常有用,只是它会拒绝非整数类型的实例化并出现编译器错误。 但是,如果您还编写了第二个重载,例如使用反向条件,则foo(1)
和foo(1.0)
都只会找到一个可行的重载,并且没有歧义。
事实上,再想一想:在推导foo(1.0)
的参数时,第一个版本(你写的那个)实际上是错误的,因为没有成员类型::type
。 然而,这不是编译器硬错误,而只是所谓的“替换失败”——这不是错误。 它只是从考虑中删除了整个模板。
作为旁注,类模板中的enable_if
有一个相关的用途,以帮助消除专业化的歧义,也使用默认参数。 它看起来像template <typename T, typename = typename std::enable_if<some_condition>::type> ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.