2013-08-20 58 views
4

我是C++中使用模板的新手,我想根據<>之間使用的類型做不同的事情,所以function<int>()function<char>()不會做同樣的事情。 我該如何做到這一點?獲取模板函數類型

template<typename T> T* function() 
{ 
    if(/*T is int*/) 
    { 
     //... 
    } 
    if(/*T is char*/) 
    { 
     //... 
    } 
    return 0; 
} 
+1

在你的情況,其中'T'無法從通話可以推斷,專業有去(如答案建議)的方式。但是,如果你實際上在參數中使用了'T'並且推導出它,那麼最好使用簡單的重載和[避免函數模板特化](http://www.gotw.ca/publications/mill17.htm) 。 – Angew

回答

6

你想用你的函數模板的顯式特:

template<class T> T* function() { 
}; 

template<> int* function<int>() { 
    // your int* function code here 
}; 

template<> char* function<char>() { 
    // your char* function code here 
}; 
+0

爲什麼不只是超負荷?重載通常比函數模板專門化更受歡迎。 –

+1

你不能只是返回值超載 –

+0

「爲什麼不只是超載?」您只能在參數類型上重載,而不能在返回類型上重載。 – utnapistim

5

創建template specializations

template<typename T> T* function() 
{ 
//general case general code 
} 

template<> int* function<int>() 
{ 
    //specialization for int case. 
} 

template<> char* function<char>() 
{ 
    //specialization for char case. 
} 
+0

@billz。是的,你有編譯器嗎?模板專門化,並明確指定模板參數。 –

-1

可以定義重載函數是這樣的:

#define INTT 0 
#define CHARR 1 
template<typename T> 
T* function() 
{ 
int type; 
type = findtype(T); 
//do remaining things based on the return type 

} 

int findType(int a) 
{ 
return INTT; 
} 

int findType(char a) 
{ 
return CHARR; 
} 
1

的最佳實踐包括標籤調度,因爲專業化是棘手的。

標籤調度更容易經常使用:

template<typename T> 
T* only_if_int(std::true_type is_int) 
{ 
    // code for T is int. 
    // pass other variables that need to be changed/read above 
} 
T* only_if_int(std::false_type) {return nullptr;} 
template<typename T> 
T* only_if_char(std::true_type is_char) 
{ 
    // code for T is char. 
    // pass other variables that need to be changed/read above 
} 
T* only_if_char(std::false_type) {return nullptr;} 
template<typename T> T* function() 
{ 
    T* retval = only_if_int(std::is_same<T, int>()); 
    if (retval) return retval; 
    retval = only_if_char(std::is_same<T, char>()); 
    return retval; 
} 
+0

這是更通用的。但我知道「專業化是棘手的」部分。爲什麼它很棘手?你能否把這個部分也添加到答案中。我可以將這個答案作爲ref ?.謝謝 –

+0

@Kroushik函數的專門化很棘手,因爲它很容易出錯!專業化*看起來有點像重載,但它不是超載,它運行在不同的規則上。超載和專業化的重疊會導致嚴重的腦筋急轉彎「爲什麼不這樣做」的問題。標籤調度避免了這個問題,因爲它沒有專門化,而是使用重載調度來完成這項工作,這減少了你需要記住的C++標準的頁數,以瞭解將要發生的事情。 – Yakk