2016-01-18 58 views
1

有誰知道以下代碼對於enable_if的模板參數是如何工作的?作爲表達式的模板參數語法

template <int n> void f(typename std::enable_if<(n < 0)>::type* = 0) { 
/* ... n is negative ... */ 
} 
template <int n> void f(typename std::enable_if<(n >= 0)>::type* = 0) { 
/* ... n is positive ... */ 
} 

具體來說這部分(n < 0)>::type*不使感我,因爲這看起來像編譯器的表達(n < 0)隱式轉換成對象。

我也看到了這種風格的表達作爲一個對象在其他幾個SFINAE的例子中,但是這裏發生的事情正在逃避我。對象是在一些C++頭文件中定義的還是已經存在於標準中?如果是這樣,將這種表達方式作爲一個對象進行處理的方法是什麼?我怎樣才能讀懂這方面的更多內容?

非常感謝。

回答

2

這看起來像編譯器表達式(N < 0)隱式轉換爲對象

n < 0號是模板參數(與bool型)std::enable_if,和std::enable_if<(n < 0)>::type是一個構件typedefstd::enable_if中定義(只有當n < 0爲真時才存在)。

template< bool B, class T = void > 
struct enable_if; 

如果Btruestd::enable_if有一個公共的typedef構件類型,等於 到T;否則,沒有成員typedef。

此元函數是利用SFINAE到 基於類型從重載解析有條件地除去功能 性狀並提供單獨的函數重載和用於不同類型的性狀特 的便利方式。 std::enable_if可作爲附加的 函數參數(不適用於運算符重載),作爲返回 類型(不適用於構造函數和析構函數)或作爲類 模板或函數模板參數。