(23条消息) enable_if使用_最后冰吻free的博客-CSDN博客
Thu Nov 24 2022 06:09:29 GMT+0000 (Coordinated Universal Time)
Saved by
@leawoliu
#include <iostream>
// enable_if禁用模板
/* enable_if<bool, typename=void>::type
类型萃取:根据第一个模板参数的编译期表达式决定行为
1.如果这个表达式为true,它的type成员会返回一个类型
-- 如果没有第二模板参数,则返回类型为void
-- 否则返回类型是第二个模板参数类型
2.如果表达式为false, 则其成员类型是未定义的,根据模板的一个叫做SFINAE(替换失败不是错误)规则
这会导致包含std::enable_if<>表达式的函数模板被忽略掉
*/
template<typename T>
typename std::enable_if<(sizeof(T)>=4)>::type func(){
}
// 和上面效果一样,达到enable_if第一个参数为false时禁用模板效果
// 当为true时展开为template<typename T, typename=void>
template<typename T, typename=std::enable_if_t<(sizeof(T)>=4)>>
void func1(){
}
// 也可以使用别名模板达到约束效果
template<typename T>
using EnableIfSizeGreater4=std::enable_if_t<(sizeof(T)>=4)>;
template<typename T, typename=EnableIfSizeGreater4<T>>
void func2(){
}
void Test(){
// func<char>(); // enable_if第一个参数为false, 推断、替换模板参数失败
// func1<char>(); // enable_if第一个参数为false, 推断、替换模板参数失败
func<int>(); // 返回类型为void
func1<int>();
func2<int>();
}
int main(){
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
content_copyCOPY
https://blog.csdn.net/CodeHouse/article/details/126505763
Comments