(1) 该模板的定义如下:
template <bool _Test, class _Ty = void>
struct enable_if {}; // no member "type" when !_Test
template <class _Ty>
struct enable_if<true, _Ty> { // type is _Ty for _Test
using type = _Ty;
};
template <bool _Test, class _Ty = void>
using enable_if_t = typename enable_if<_Test, _Ty>::type;
当第一个模板参数为 true 时 , 名称 enable_if_t 才对应类型名 _Ty 。进而可以用 enable_if_t 来定义变量。
看源码时,经常出现的情况是类的成员函数是模板函数,但对成员函数的模板参数的类型加以限制。
即某些条件满足时才可以调用类的该成员函数。若类里只有一个具有此名字的成员函数,且对其调用的条件不满足(没有给出合适的模板参数),结果是在编译阶段,代码就报错了。这就是使用 enable_if_t 的好处。
举个 STL 库中为类的模板成员函数使用 enable_if_t 的例子:
(2)写个小练习:
上例中的 A 只可以接受 char 类型的实参。若以其它类型为实参,则编译阶段就报错了,很神奇呢:
谢谢阅读