模板之型别选择

不念不忘少年蓝@ 2022-08-10 11:57 144阅读 0赞

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

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

  1. // traits class template
  2. template <typename T, bool isPolymorphic>
  3. struct NiftyContainerValueTraits
  4. {
  5. typedef T* ValueType;
  6. };
  7. template <typename T>
  8. struct NiftyContainerValueTraits < T, false >
  9. {
  10. typedef T ValueType;
  11. };
  12. template <typename T, bool isPolymorphic>
  13. class NiftyContainer
  14. {
  15. // Traits
  16. typedef NiftyContainerValueTraits<T, isPolymorphic> Traits;
  17. typedef typename Traits::ValueType ValueType;
  18. ....
  19. };

这样做法笨拙难用,无法扩充:针对不同型别选择,都必须定义出专属 traits class template

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

  1. template <bool flag, typename T, typename U>
  2. struct Select
  3. {
  4. typedef T Result;
  5. };
  6. template <typename T, typename U>
  7. struct Select < false, T, U >
  8. {
  9. typedef U Result;
  10. };
  11. template <typename T, bool isPolymorphic>
  12. class NiftyContainer
  13. { ...
  14. typedef Select<isPolymorphic, T*, T>::Result ValueType;
  15. };

发表评论

表情:
评论列表 (有 0 条评论,144人围观)

还没有评论,来说两句吧...

相关阅读