一、引语和结论
这玩意干啥的?见名知意,if 当某个条件成立时,enable xxx(~~~~). 这胡说有用么,显然并不是胡说,咱们有依据的。
这里咱们先给出结论:
std::enable_if_t
还真就是在模版中判断当条件为true时,type
类型存在(实际为模版类型_Ty
的别名);否则type
类型未定义,在未定义条件下使用,编译器报错。这就可以很舒服的做到,在编译阶段使得某些模板在特定条件下可用,而在其他条件下不可用。
二、源码剖析
template <bool _Test, class _Ty = void>
struct enable_if {}; // no member "type" when !_Testtemplate <class _Ty>
struct enable_if<true, _Ty> { // type is _Ty for _Testusing type = _Ty;
};template <bool _Test, class _Ty = void>
using enable_if_t = typename enable_if<_Test, _Ty>::type;
我们通过源码剖析来证实咱们在上面抛出的结论。
template <bool _Test, class _Ty = void>
struct enable_if {}; // no member "type" when !_Test
enable_if
为模版类型,接受两个模版参数:一个bool类型 的常量 _Test
和一个类型_Ty
,缺省类型为void
;
这里很好理解,不过多赘述。
template <class _Ty>
struct enable_if<true, _Ty> { // type is _Ty for _Testusing type = _Ty;
};
诶,上面已经定义了一个 enable_if
,这里怎么又定义了一次,不会报错么?—— 这样的问题,观看本篇的小伙伴应该不会存在疑惑的吧。我可是默认了大家有一定的模版基础知识功底的哈。
说说,这里 struct enable_if<true, _Ty>
是啥子啊,不就是模版的特化么,我就默认第一个参数是true,我还接受一个模版参数 _Ty
; 好么,这时候,我就玩点花样了。既然你告诉了我你是CHU
,哦,说错了,是true
,那我也大方点,给你取个别样的小名,using type = _Ty;
,我也不管你具体是啥类型了,反正这会我都叫你type
;
- 这点,渣男必学。譬如你同时撩了多个妹子,或者情史复杂,故事很多(我有酒,欢迎来讲),你总担心会在某个妹子面前交错名字。这时候你就得用上这个智慧了,统一提前洗脑,所有妹子不叫名字,
darling
,honey
…随便选。 (博主声明:只作为教学,本人不曾使用此策略)
template <bool _Test, class _Ty = void>
using enable_if_t = typename enable_if<_Test, _Ty>::type;
这个么更好说了,enable_if_t
就是type
的别名, 而 type
当 _Test
为true时,他是 _Ty
的别名;当_Test
为false时,type
就不存在, enable_if_t
自然也不存在(好家伙,女友条件管理大师啊)
破案了,破案了。
所以,这会儿你应该彻底搞懂std::enable_if
了吧。而且是