CG@CPPBLOG

/*=========================================*/
随笔 - 76, 文章 - 39, 评论 - 137, 引用 - 0
数据加载中……

《C++设计新思维》读书笔记(11)

2.6 型别选择

有时候,泛型程序需要根据一个bool量来选择某个型别。

假如对NiftyContainer,你需要一个std::vector作为后端存储结构。那么可能对于多态型别,你不能存储实体,只能存储指针。而对于非多态型别,你可以存储实体,因为这样有效率。

在你的class template中:

1 template <typename T, bool isPolymorphic>
2 class NiftyContainer
3 {
4     //
5 };

你要放一个 vector<T*> 或者 vector<T>。根据isPolymorphic来定,你可以使用 traits class template 如下:

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

这种方法难用而且没有复用性,我们可以这样做:

 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     //
15     typedef Select<isPolymorphic, T*, T>::Result ValueType;
16     vector<ValueType> vec;
17 };

posted on 2007-12-20 22:00 cuigang 阅读(227) 评论(0)  编辑 收藏 引用 所属分类: 《C++设计新思维》读书笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理