更多 C++ 慣用法/型別選擇
外觀
根據編譯時布林值或謂詞在編譯時選擇型別。
能夠根據編譯時已知的資訊做出決策是一個強大的超程式設計工具。 編譯時可以做出的決策之一是決定型別,即型別選擇可能根據謂詞的結果而有所不同。
例如,考慮一個作為類模板實現的佇列抽象資料型別 (ADT),它儲存 Ts 的靜態陣列,佇列的最大容量作為模板引數傳遞。 Queue 類還需要儲存其中存在的元素數量,從零開始。 這種佇列類的可能最佳化可能是使用不同型別來儲存大小。 例如,當佇列的最大容量小於 256 時,可以使用無符號字元,如果容量小於 65,536,可以使用無符號短整型來儲存大小。 對於更大的佇列,使用無符號整型。 型別選擇慣用法可用於實現這種編譯時決策制定。
實現型別選擇慣用法的簡單方法是IF 模板。 IF 模板接受三個引數。 第一個引數是編譯時布林條件。 如果布林條件計算結果為true,則選擇傳遞給 IF 模板的第二個型別,否則選擇第三個型別。 型別選擇慣用法包含一個主模板和一個部分特化,如下所示。
template <bool, class L, class R>
struct IF // primary template
{
typedef R type;
};
template <class L, class R>
struct IF<true, L, R> // partial specialization
{
typedef L type;
};
IF<false, int, long>::type i; // is equivalent to long i;
IF<true, int, long>::type i; // is equivalent to int i;
我們現在使用型別選擇慣用法來實現上面提到的佇列大小最佳化。
template <class T, unsigned int CAPACITY>
class Queue
{
T array[CAPACITY];
typename IF<(CAPACITY <= 256),
unsigned char,
typename IF<(CAPACITY <= 65536),
unsigned short,
unsigned int
>::type
>::type size;
// ...
};
Queue 類模板宣告 Ts 的一個數組。 size 資料成員的型別取決於使用IF 模板執行的兩個比較的結果。 請注意,這些比較不是在執行時執行,而是在編譯時執行。
- Boost.MPL 庫
- std::conditional