2.6
型别选择
有时候,泛型程序需要根据一个bool量来选择某个型别。
假如对NiftyContainer,你需要一个std::vector作为后端存储结构。那么可能对于多态型别,你不能存储实体,只能存储指针。而对于非多态型别,你可以存储实体,因为这样有效率。
在你的class
template中:
1 template <typename T, bool isPolymorphic>
2 class NiftyContainer
3 {
4 //![](http://www.cppblog.com/Images/dot.gif)
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 //![](http://www.cppblog.com/Images/dot.gif)
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 //![](http://www.cppblog.com/Images/dot.gif)
15 typedef Select<isPolymorphic, T*, T>::Result ValueType;
16 vector<ValueType> vec;
17 };