红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【C++】类型特性

类型特性

<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();
    }
}