2012-11-22 154 views
3

考慮這個類模板:現在模板模式匹配

template <typename T1, typename T2, bool B> 
class SomeClass { }; 

,我想提供基於B==trueB==false兩種實現方式。也就是說,我想說的是這樣的:

template <ANYTHING, ANYTHING, true> class SomeClass { 
// First implementation 
}; 

template <ANYTHING, ANYTHING, false> class SomeClass { 
// Second implementation 
}; 

這怎麼能在C++(11)中完成?

回答

6

隨着偏特:

// primary 
template<typename X, typename Bool> 
struct Foo; 

template<typename X> 
struct Foo<X, std::true_type> {}; 

template<typename X> 
struct Foo<X, std::false_type> {}; 

// use 
Foo<X, std::true_type> x; 

我用一個類型包裝器bool,但你也可以做到這一點與 非類型模板參數:

// primary 
template<typename, bool> 
struct Foo; 

template<typename X> 
struct Foo<X, true> {}; 

template<typename X> 
struct Foo<X, false> {}; 

// use 
Foo<X, true> x; 

有時候,你可以計算用於部分專業化的值 使用默認參數中的元編程:

// primary 
template<typename X, typename is_integral_ = std::is_integral<X>::type> 
struct Foo; 

這使得配置變量可以被用戶選擇覆蓋。

struct my {}; 
Foo<my, std::true_type> x; 

爲了防止這種情況,調度通過繼承:

// primary, where Foo_impl is any of the above 
template<typename X> 
struct Foo : public Foo_impl<X> {}; 
+1

太棒了!這回答了我的問題。謝謝。你爲什麼使用這個包裝? – Cartesius00

+0

請注意,第一個版本不適用於'Foo >'。我不知道這是否可取。 –

+0

@ R.MartinhoFernandes你的意思是第二個版本,對吧? – pmr

4

這就是所謂的偏特

template <typename T1, typename T2> class SomeClass<T1 ,T2, true> { 
// First implementation 
}; 

template <typename T1, typename T2> class SomeClass<T1, T2, false> { 
// Second implementation 
}; 

正如它的名字表明它是關係到(全)專業化看起來像這樣:

template <> class SomeClass<int, char, false> { 
// dedicated version for T1=int, T2=char, B=false 
}; 

注意,如果大部分的執行是一樣的,你也可以寫一個通用版本,其中僅依賴於布爾參數代碼委託給特質類。在這種情況下,特質類將完全專用於單個參數。

+0

也是一個完美的答案。謝謝。 – Cartesius00