一、 s t d : : c o n d i t i o n a l std::conditional std::conditional的使用
C + + 11 C++11 C++11标准引入了 s t d : : c o n d i t i o n a l std::conditional std::conditional,这是一个类模板,用于表现一种编译期间的分支逻辑。
它的实现代码比较简单,如下所示:
//std::conditional用于表现一种编译期的分支逻辑
//代码实现
//泛化版本
template<bool b,class T,class U>
struct conditional {
using type = T;
};
//特化版本
template<class T,class U>
struct conditional<false,T,U> {
using type = U;
};
可以发现,在它的模板中,如果第一个参数为 f a l s e false false,那么我们将会调用它的特化版本,其内部的 t y p e type type将被替换为第二个 U U U类型。反之,将调用它的泛化版本, t y p e type type也将会被替换为第一个 T T T类型。
下面是 s t d : : c o n d i t i o n a l std::conditional std::conditional的一个简单使用
//std::conditional的简单使用
void Test1() {
std::conditional<true, int, double>::type a1; //true,使用泛化类型,type = int
std::conditional<false, int, double>::type a2;//false,使用特化类型,type = double
std::cout << "a1的类型为:" << typeid(a1).name() << "\n";
std::cout << "a2的类型为:" << typeid(a2).name() << "\n";
}
可以发现, a 1 a1 a1的类型是 i n t int int,而 a 2 a2 a2的类型为 d o u b l e double double。
二、使用 s t d : : c o n d i t i o n a l std::conditional std::conditional实现编译期间的条件分支
我们可以使用 s t d : : c o n d i t i o n a l std::conditional std::conditional的嵌套来实现多重分支。考虑以下代码:
constexpr int j = 30;
std::conditional<(j > 100), double,// (j>100) -> double
std::conditional<(j > 50), float,// (j>50)-> float
std::conditional<(j > 20), int, //(j>20) -> int
std::conditional<(j > 0), char, long long> //(j>0) -> char ,(j<=0) ->long long
::type>::type>::type>::type j_type;
std::cout << "j的类型为:" << typeid(j_type).name() << "\n";
这里实现了不同大小的 j j j,得到不同的类型。观察发现,这里的类型显然是 i n t int int。
运行后:
同样的, s t d : : c o n d i t i o n a l t std::conditional_t std::conditionalt是标准库中 s t d : : c o n d i t i o n a l std::conditional std::conditional的别名模板,我们可以通过以下代码来简写:
//也可以使用别名模板std::conditional_t来简写
const int k = 80;
std::conditional_t<(k > 100), double,// (j>100) -> double
std::conditional_t<(k > 50), float,// (j>50)-> float
std::conditional_t<(k > 20), int, //(j>20) -> int
std::conditional_t<(k > 0), char, long long>>>>k_type; //(j>0) -> char ,(j<=0) ->long long j_type;
std::cout << "k的类型为:" << typeid(k_type).name() << "\n";
其中 k k k的类型为 f l o a t float float: