现在的位置: 首页 > 综合 > 正文

模板之型别选择

2018年03月30日 ⁄ 综合 ⁄ 共 918字 ⁄ 字号 评论关闭

问题:在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;
};

抱歉!评论已关闭.