怎么用std::conditional_t去控制是否启用某些功能
- std::conditional 基本作用就是,当第一个非类型模板参数的值为true时,type的类型为第一个类型模板参数的类型,为false时为第二个类型模板参数的值。
- 通过
std::conditional_t
可以控制函数中的一些状态,是否记录函数的耗时或者函数的log等信息。 - MyFunction定义了通过模板RecordLog来控制函数中Recorder的定义,因为是模板控制函数中的类型,所以需要在编译阶段确定,所以不能用
MyFunction<record_log>(num);
来代替显性的true或false, 因为这个变量是运行时确定的,不是编译时确定,所以需要显性写true或false。 - 当
RecordLog=true
时, Recorder实际上是perf_recorder::Log
类型;当为false时,是char const*类型;而且声明的这个变量可能不会被下面代码使用,所以只有定义过程,为了防止clang提示变量未使用的错误,所以加上C++17才有的maybe_unused 属性。 - 这个
std::conditional_t
(C++14)相当于 typename std::conditional<boo, T, T1>::type
(C++11)
template <bool RecordLog>
void MyFunction(int num) {
using Recorder =
std::conditional_t<RecordLog, perf_recorder::Log, char const*>;
[[maybe_unused]] const Recorder recorder("Main::MyFunction");
....
}
void MainFunction(int num, bool record_log) {
if (record_log) {
MyFunction<true>(num);
} else {
MyFunction<true>(num);
}
}