2013-03-09 72 views
11

考慮一個簡單的函數模板:是否有明確說明模板類型的原因?

template <typename T> 
void FunctionTemplate(T t){ 
} 

void MyFunction(){ 
    int a; 
    FunctionTemplate(a); 
    FunctionTemplate<int>(a); 
} 

在第一次調用(FunctionTemplate(a)),編譯出哪個提出了一個問題的類型,是否有任何理由,呼籲FunctionTemplate的第二種方式的存在( FunctionTemplate<int>(a))或者我們無法使用第一種方法的任何令人信服的理由?

編輯:我的術語我稍微偏離,所以請根據需要進行編輯。

回答

13

有時候你會想指定模板參數,即使你沒有到。假設您的函數採用類型爲T的參數,並且您有一個int,但您希望該函數將其作爲float。那麼你需要明確地說FunctionTemplate<float>(my_int)

也有很多情況下,模板參數不能被推斷。考慮以下幾點:

template <typename T> 
T FunctionTemplate() { 
    return T(); 
} 

不管你怎麼稱呼這個,如果你不提供模板參數,的T類型不能自動推斷。在這種情況下,簡單的原因是調用網站沒有提及它期望的返回類型。

對於術語:當您不指定模板參數時,該模板被隱式地實例化;當您指定模板參數時,模板將被顯式實例化。

+0

我會選擇'FunctionTemplate((float)my_int)'這樣簡單的單參數函數模板。雖然口味各不相同! – Ajay 2013-03-10 06:11:23

9

假設您想將該函數作爲參數傳遞給另一個方法;

myAlgorithm(myFunction<int>); 

或者假設你想保證一個函數的浮點版本用於速度;

myFunction<float>(2.0); 

(忘了寫2.0f是不是現在的問題)

+0

sftrabbit還提出了在他的回答一個很好的例子;當返回類型取決於模板,但沒有參數。 – Dave 2013-03-09 19:38:17

7

的使用迫使編譯器使用模板函數的特定版本:

template <typename T> 
T func(T x, T y) 
{ 
    // ... 
} 

int main() 
{ 
    int x = 10; 
    float y = 20; 

    func(x, y); //ERROR no matching function for call to 'func(int&, float&)' 

    func<float>(x, y); // OK, Uses float version of func 
}