模板之型别选择
问题:在NiftyContainer 例子中,也许以一个std::vector 作为后端存储结构。面对 polymorphic 型别,不能存储其对象实体,必须存储其指针。但如果面对 non-polymorphic 型别,可以存储其实体,比较有效率。这时,vector
方法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;
};
还没有评论,来说两句吧...