码迷,mamicode.com
首页 > 其他好文 > 详细

类型选择之 Conditional 和 Select

时间:2020-06-30 13:07:58      阅读:44      评论:0      收藏:0      [点我收藏+]

标签:lse   code   unsigned   实现   别名   type   return   struct   nbsp   

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

标签:lse   code   unsigned   实现   别名   type   return   struct   nbsp   

原文地址:https://www.cnblogs.com/lhb666aboluo/p/13212990.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!