簡體   English   中英

模板模式匹配

[英]Template pattern matching

考慮這個類模板:

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)中完成?

具有部分專業化:

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM