2.6
型別選擇
有時(shí)候,泛型程序需要根據(jù)一個(gè)bool量來選擇某個(gè)型別。
假如對(duì)NiftyContainer,你需要一個(gè)std::vector作為后端存儲(chǔ)結(jié)構(gòu)。那么可能對(duì)于多態(tài)型別,你不能存儲(chǔ)實(shí)體,只能存儲(chǔ)指針。而對(duì)于非多態(tài)型別,你可以存儲(chǔ)實(shí)體,因?yàn)檫@樣有效率。
在你的class
template中:
1 template <typename T, bool isPolymorphic>
2 class NiftyContainer
3 {
4 //
5 };
你要放一個(gè)
vector<T*> 或者 vector<T>。根據(jù)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 };
這種方法難用而且沒有復(fù)用性,我們可以這樣做:
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 };