类型特性
<type_traits>库用于判断某个类型是否具有某些特征、改变、比较类型间的特征
常用于函数模板类
结合if constexpr(常量表达式)可以实现条件编译(C++=17)
if constexpr是编译时的条件语句,当表达式条件为真时,该分支代码才会编译,否则舍弃
1
2
3
4
5
6
7
8
9
10
template<typename T>
double length(T& t){
if constexpr (std::is_arithmetic_v<T>){
if (t<0) return -t;
return t;
}
else if constexpr (std::is_base_of_v<IMeasurable, T>){
return t.length();
}
}结合static_assert
static_assert用于判断编译阶段条件是否为真,若为假则会终止编译,并产生静态断言错误
1
2
3
4
5
6
7
8
9
10
11
template<typename T>
double length(T& t){
static_assert(std::is_arithmetic_v<T>||Std::is_base_of_v<IMeasurable, T>, "使用了不支持计算长度的类型")
if constexpr (std::is_arithmetic_v<T>){
if (t<0) return -t;
return t;
}
else if constexpr (std::is_base_of_v<IMeasurable, T>){
return t.length();
}
}