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 };