std::conditional从C11开始支持其使用方法如下​ template bool B, class T, class F struct conditional;将根据B的值来判断来提供数据类型若B为true则提供数据类型为T反之则提供数据类型为F例#include iostream #include type_traits #include typeinfo int main() { typedef std::conditionaltrue, int, double::type Type1; typedef std::conditionalfalse, int, double::type Type2; typedef std::conditionalsizeof(int) sizeof(double), int, double::type Type3; std::cout typeid(Type1).name() \n; std::cout typeid(Type2).name() \n; std::cout typeid(Type3).name() \n; }输出结果为int double double用法1. 模板参数推导选择成员 / 返回类型templatetypename T auto get_value(T t) - std::conditional_tstd::is_pointer_vT, T*, T { if constexpr(std::is_pointer_vT) return t; else return t; }2. 容器 / 底层存储类型选择templatelong MaxVal using SelectIntType std::conditional_t MaxVal 32767, short, std::conditional_tMaxVal 2147483647, int, long long ; using T1 SelectIntType1000; // short using T2 SelectIntType100000; // int using T3 SelectIntType3e10; // long long3. 条件添加 const /volatile/ 引用修饰// 如果布尔为true就变成const T否则T templatebool IsConst, typename T using CondConst std::conditional_tIsConst, const T, T; CondConsttrue, int // const int CondConstfalse, int // int4. 配合 std::enable_if做重载的类型选择templatetypename T struct Wrapper { // 整数用int存储浮点用double存储 using storage_type std::conditional_tstd::is_integral_vT, int, double; storage_type data; };5. 对齐、内存布局条件选择对齐类型// 是否启用simdtrue用__m128否则用float[4] templatebool UseSimd using Vec4 std::conditional_tUseSimd, __m128, float[4];6. 元编程分支类型列表、递归元编程在模板元编程循环中做终止条件判断。// 元编程取第N个类型极简示意 templateint N, typename...Args struct NthType; templateint N, typename Head, typename...Tail struct NthTypeN,Head,Tail... { using type typename std::conditional_t N 0, std::type_identityHead, NthTypeN-1, Tail... ::type; };这里通过原编程从参数包Args...取出第N个类型作用类型包装器把 T 包一层壳内部别名::type还原成 T。type_identityint::type → int type_identity_tdouble → double这里说明std::type_identity是在C20 引入头文件type_traits7. 两边类型都会实例化不会短路// 即使条件falsefalse分支的类型依然会实例化直接编译报错 using Bad std::conditional_tfalse, typename T::no_such_type, int;解决用std::type_identity惰性包装推迟实例化。templatebool Cond,typename T,typename U using lazy_cond_t typename std::conditional_tCond,std::type_identityT,std::type_identityU::type;