enableif结构定义和默认模板参数
enable_if struct definition and default template parameter
根据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
在std::is_integral<T>::value
等于true
的情况下,可以在没有指定类型T的情况下调用。在这种情况下,将调用std::enable_if的专业化,并且在该定义中没有默认的模板参数。
是由于推导出模板参数机制吗?如果是,为什么为非专业化定义指定默认参数?
你的问题有点神秘,但据我所知:
我想知道在没有指定类型T 的情况下如何调用
...
-
不会;
foo
和enable_if
模板将仅在用户需要它们的实例化(隐式或显式)以及T
的特定值时实例化。所以T
总是被指定的。 -
默认模板参数仅在"基本"模板定义中提供(即而非专业化)。这就是为什么您只在
enable_if
的第一个声明中看到它。然而,它们会影响所有专业化(基本上,如果实例化enable_if<X>
,编译器会发现您没有为基本模板提供任何参数,并尝试将所有专业化与参数列表<X, void>
匹配)。
BTW第二个模板参数用于从enable_if
获得与void
:不同的类型
std:enable_if<1, int>::type f();
将只是CCD_ 13。
enable_if
模板的目的是从重载集中删除函数模板。就其本身而言,您的示例并不是很有用,只是它会拒绝带有编译器错误的非整数类型的实例化。但是,如果您还编写了第二个重载,例如使用相反的条件,那么foo(1)
和foo(1.0)
都只会找到一个可行的重载,并且没有歧义。
事实上,再考虑一下:在推导foo(1.0)
的参数时,第一个版本(您编写的版本)实际上是错误的,因为没有成员类型::type
。但是,这不是硬编译器错误,而是所谓的"替换失败"–这是而不是错误。它只是将整个模板从考虑中删除。
附带说明一下,类模板中有enable_if
的相关用法,可以帮助消除specializaons,也使用默认参数。它看起来有点像template <typename T, typename = typename std::enable_if<some_condition>::type> ...
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本