std::conditional C++11引入的类模板,表示的是一种编译期的分支逻辑,我们来看看它的源码吧,其实非常的简单。
// STRUCT TEMPLATE conditional
template <bool _Test, class _Ty1, class _Ty2>
struct conditional { // Choose _Ty1 if _Test is true, and _Ty2 otherwise
using type = _Ty1;
};
template <class _Ty1, class _Ty2>
struct conditional<false, _Ty1, _Ty2> {
using type = _Ty2;
};
template <bool _Test, class _Ty1, class _Ty2>
using conditional_t = typename conditional<_Test, _Ty1, _Ty2>::type;
从以上可以看到,std::conditional 包含一个泛化和特化的版本,在结构体里面用type来表示类型模板参数的类型,当第一个非类型模板参数的值为true时,type的类型为第一个类型模板参数的类型,为false时为第二个类型模板参数的值。
class A
{
public:
void T()
{
std::cout << "OUT : A" << std::endl;
}
};
class B
{
public:
void T()
{
std::cout << "OUT : B" << std::endl;
}
};
int main(int argc, char* argv[])
{
std::conditional<true, int, float>::type var;
std::cout << typeid(decltype(var)).name() << std::endl;
std::conditional<false, A, B>::type var1;
std::cout << typeid(decltype(var1)).name() << std::endl;
var1.T();
return 0;
}
int
class B
OUT : B
第一个参数必须是常量,毕竟模板是需要在编译的时候就需要知道具体类型。