2013-02-23 75 views
0

例如,我有以下模板函數:當給定默認模板參數時,將選擇什麼模板值?

template<class IntType = typename boost::uintmax_t> 
IntType someFunnyFunc(IntType x, IntType y, IntType z) { ... } 

現在我有以下代碼:

int main() { 
    short a=1, b=2, c=3; 
    someFunnyFunc(a, b, c); 
    return 0; 
} 

將所有的編譯器生成的函數

boost::uintmax_t someFunnyFunc(boost::uintmax_t x, boost::uintmax_t y, boost::uintmax_t z) { ... } 

,因爲短CAN被轉換爲boost :: uintmax_t,或者一些編譯器會生成

short someFunnyFunc(short x, short y, short z) {...} 

我需要這個,因爲我的算法使用一個循環,循環更頻繁,當我使用短整數而不是大整數時。

您可能會問,爲什麼我不簡單地自己定義boost::uintmax_t someFunnyFunc(boost::uintmax_tx, boost::uintmax_t y, boost::uintmax_tz) { ... }並且完成它。 我這樣做,因爲我想使自定義的整數類型成爲可能,例如可以使用plattform不直接支持的更大的整數。

編輯: 難道這解決了我的問題:

template<class IntType> 
IntType someFunnyFunc(IntType x, IntType y, IntType z) { ... } 

boost::uintmax_t someFunnyFunc(boost::uintmax_t x, boost::uintmax_t y, boost::uintmax_t z) { 
    return someFunnyFunc<boost::uintmax_t>(x, y, z); 
} 

回答

2

編譯器將不執行類型轉換。他們將生成:

short someFunnyFunc(short x, short y, short z) 

簡而言之,編譯器選擇「最小阻力路徑」。在執行類型轉換時存在「阻力」,但在生成完美匹配您的參數的函數簽名時沒有「阻力」。

如果存在多條路徑相等的「阻力」,則可能會出現模糊(或無匹配函數)錯誤(編譯器應採用哪條路徑?)。例如,如果您嘗試通過short,intlong,you'll get an error,因爲您正在嘗試執行的操作沒有適當的匹配簽名。編譯器不能推導出該函數的正確類型,因爲有幾種可能性,但它們都不是「最好的」。

編輯:不,這不會解決您的問題。如果您通過short s,編譯器將選擇模板化函數(並使用IntType = short)。

如果要使用boost::uintmax_t但只通過short參數,則只需執行someFunnyFunc<boost::uintmax_t>(short_1, short_2, short_3);。你也可以這樣做:

template<class IntType> 
IntType someFunnyFunc(IntType x, IntType y, IntType z) { ... } 

// If you try to pass shorts, the compiler will opt for this version: 
boost::uintmax_t someFunnyFunc(short x, short y, short z) { 
    return someFunnyFunc<boost::uintmax_t>(x, y, z); 
} 

假設你想使用boost::uintmax_t但仍然可以通過short秒。