2015-07-19 18 views
4

我已經閱讀了很多關於推導變量類型的文章,都使用auto和without。我認爲我只有兩個問題。使用模板vs功能的好處以及如何推導模板中的類型

讓我們以一個簡單的範圍函數爲例。我可以把它的模板,並把它稱爲:

template <class T, T min, T max> bool inRange(T value) { 
    return min <= value && value <= max; 
} 

bool bbb = inRange<int, 5, 10>(7); 

或者我可以這樣做:

template <class T> bool inRange(T min, T max, T value) { 
    return min <= value && value <= max; 
} 

bool bbb = inRange(5, 10, 7); 

問題

  1. 有沒有辦法(短創建多個模板1,每個模板用於短,int,long,double等),可以推導出類型,板可以與inRange<min, max>(value)

  2. 被稱爲是不是有在inRange<min, max>(value)inRange(min, max, value)

+3

'inRange (value)'只在'min' /'max'是常量時才起作用。 – melpomene

+0

已經有一些建議允許扣除非類型模板參數的類型,但它們還沒有準備好。 –

回答

1
  1. 時刻的任何優勢。有一個建議將其添加到未來版本的C++中:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4469.html
  2. 第一種方法inRange<T, min, max>(value)比較笨拙,因爲我們尚未實現上述提議,並且無法寫入inRange<min, max>(value)。如果min和max在編譯時未知,則無論如何,第二種方法inRange(min, max, value)是唯一的選項。第二類的內聯函數應該和第一類的內聯函數一樣有效,所以幾乎沒有任何優勢。
+0

如果出現'min> max',編譯器可以不斷摺疊第一個示例,但不是第二個示例。但是,由於必須在*編譯時*知道,除非你有某種類型的錯誤,否則它可能不會發生。 – Kevin

+0

@Kevin'min> max'是一個完全正常的方式來指定一個空的間隔,而一個空的間隔是一個完全正常的方式來終止一個基於漸進式細化間隔的(編譯時)遞歸計算... –

+0

足夠公平,但如果你正在做模板元編程,你可能已經知道你需要哪個例子。 – Kevin