[英]Template pattern matching
考慮這個類模板:
template <typename T1, typename T2, bool B>
class SomeClass { };
現在,我想提供兩個基於B==true
和B==false
。 也就是說,我想說些類似的話:
template <ANYTHING, ANYTHING, true> class SomeClass {
// First implementation
};
template <ANYTHING, ANYTHING, false> class SomeClass {
// Second implementation
};
如何在C ++(11)中完成?
具有部分專業化:
// 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> {};
這稱為部分專業化 :
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
};
請注意,如果大多數實現都是相同的,則還可以編寫一個通用版本,其中僅將依賴於bool參數的代碼委派給trait類。 在這種情況下,特征類將在單個參數上完全專業化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.