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