std::enable_if
来自cppreference.com
该页由英文版wiki使用Google Translate机器翻译而来。
该翻译可能存在错误或用词不当。鼠标停留在文本上可以看到原版本。你可以帮助我们修正错误或改进翻译。参见说明请点击这里. |
在头文件 <type_traits> 中定义
|
||
template< bool B, class T = void > struct enable_if; |
(C++11 起) | |
如果
B
是true,std::enable_if有一个公共的的成员typedeftype
,等于T
,否则,是没有成员typedef. 原文:
If
B
is true, std::enable_if has a public member typedef type
, equal to T
; otherwise, there is no member typedef. 元函数用于有条件地删除函数和类重载解析类型特征的基础上,并提供单独的函数重载和专业的不同类型的特征。 std::enable_if可以作为一个额外的函数参数(不适用的操作符重载),并不适用于构造函数和析构函数的返回类型(),或作为类模板或函数模板的参数.
原文:
This metafunction is used to conditionally remove functions and classes from overload resolution based on type traits and to provide separate function overloads and specializations for different type traits. std::enable_if can be used as an additional function argument (not applicable to operator overloads), as a return type (not applicable to constructors and destructors), or as a class template or function template parameter.
目录 |
[编辑] 会员类型
类型
|
Definition |
type
|
无论是
T 或任何股东,根据B 的价值原文: either T or no such member, depending on the value of B |
[编辑] 可能的实现
template<bool B, class T = void> struct enable_if {}; template<class T> struct enable_if<true, T> { typedef T type; }; |
[编辑] 示例
#include <type_traits> #include <iostream> // foo1 overloads are enabled via the return type template<class T> typename std::enable_if<std::is_floating_point<T>::value, T>::type foo1(T t) { std::cout << "foo1: float\n"; return t; } template<class T> typename std::enable_if<std::is_integral<T>::value, T>::type foo1(T t) { std::cout << "foo1: int\n"; return t; } // foo2 overload is enabled via a parameter template<class T> T foo2(T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0) { return t; } // foo3 overload is enabled via a template parameter template<class T , class = typename std::enable_if<std::is_integral<T>::value>::type > T foo3(T t) // note, function signature is unmodified { return t; } // A is enabled via a template parameter template<class T, class Enable = void> class A; // undefined template<class T> class A<T, typename std::enable_if<std::is_floating_point<T>::value >::type> { }; int main() { foo1(1.2); // OK, calls the first version of foo1() foo1(10); // OK, calls the second version of foo1() // foo2(0.1); // compile-time error foo2(7); // OK // A<int> a1; // compile-time error A<double> a1; // OK }
输出:
foo1: float foo1: int