类型选择之 Conditional 和 Select

Posted lhb666aboluo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类型选择之 Conditional 和 Select相关的知识,希望对你有一定的参考价值。

Conditional:在两种类型中进行选择的方法。
Select:在多种类型中进行选择的方法。
区别:
?: 是在多个值中进行选择。而Conditional和Select是用来选择类型的。

关于conditional: 
conditional模板是标准库的一部分(定义在<type_traits>中)。
其实现为:

template<bool C, typename T, typename F>       //通用模板
struct conditional{
    using type = T;
}; 

template<typename T, typename F>            //false的特例化版本 
struct conditional<false,T,F>{
    using type = F;
}; 

例如:
typename std::conditional<(std::is_polymorphic<T>::value),X,Y>::type z;

为了改进语法,可以也引入一个别名:
template<bool B, typename T, typename F>
using Conditional = typename std::conditional<B,T,F>::type;

同时添加一个函数: 
template<typename T>
constexpr bool Is_polymorphic()
{
    return std::is_polymorphic<T>::value;
}

基于上面的定义,可以改写此代码为:
Conditional<(Is_polymorphic<T>()),X,Y> z; 

关于select:
template<unsigned N, typename... Cases>            //一般情况;不会被实例化 
struct select;

template<unsigned N, typename T, typename... Cases>
struct select<N,T,Cases...> :select<N-1,Cases...>{
};

template<typename T, typename... Cases>            //最终情况:N==0
struct select<0,T,Cases...>{
    using type = T;
};

template<unsigned N, typename... Cases>
using Select = typename select<N,Cases...>::type;

 

以上是关于类型选择之 Conditional 和 Select的主要内容,如果未能解决你的问题,请参考以下文章

spring源码分析之@Conditional

spring boot 系列之六:@Conditional和spring boot的自动配置

手把手写深度学习:十大GANs之conditional GANs

手把手写深度学习:十大GANs之conditional GANs

手把手写深度学习:十大GANs之conditional GANs

(007)Spring Boot之自动装配接口Condition对应注解Conditional及其一些默认实现