模板之型别选择

问题:在NiftyContainer 例子中,也许以一个std::vector 作为后端存储结构。面对 polymorphic 型别,不能存储其对象实体,必须存储其指针。但如果面对 non-polymorphic 型别,可以存储其实体,比较有效率。这时,vector <T*> 还是 vector<T> 需要根据 isPolymorphic 来决定 ValueType 定义为 T * 或 T。

方法1:可以选择 traits class template 实现,如下:

// traits class template
template <typename T, bool isPolymorphic>
struct NiftyContainerValueTraits
{
	typedef T* ValueType;
};
template <typename T>
struct NiftyContainerValueTraits < T, false >
{
	typedef T ValueType;
};
template <typename T, bool isPolymorphic>
class  NiftyContainer
{
	// Traits
	typedef NiftyContainerValueTraits<T, isPolymorphic> Traits;
	typedef typename Traits::ValueType ValueType;
   ....
};
这样做法笨拙难用,无法扩充:针对不同型别选择,都必须定义出专属 traits class template 

方法二:Select class template 可使型别的选择立时可用,它采用偏特化机制:

template <bool flag, typename T, typename U>
struct Select
{
	typedef T Result;
};
template <typename T, typename U>
struct Select < false, T, U >
{
	typedef U Result;
};
template <typename T, bool isPolymorphic>
class  NiftyContainer
{       ...
	typedef Select<isPolymorphic, T*, T>::Result ValueType;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值