2012-05-18 42 views
2

我一直在尋找一個明確的答案,我只是從網絡上捕捉點點滴滴。顯式模板函數和方法專業化

我有一個函數,它需要基於類型變量採取不同的行爲。該函數不帶任何參數,所以重載不起作用,導致模板專業化。例如:

//Calls to this function would work like this: 
int a = f(); 
int b = f<int>(); 
int c = f<char>(); 
//... 

首先,即使在句法上可能嗎?我感覺就是這樣。繼續。

我在定義這個函數時遇到了問題,因爲我掛上了顯式專業化的語法。我嘗試了很多不同的方法,但我還沒有得到一個簡單的例子來工作。其次,我試圖(最終)將該模板函數轉換爲(非模板)類的模板方法。當我來到它時,我會穿過那座橋。

謝謝
伊恩

回答

3

嗯,這是可能的,但不是的更好做的事情之一。顯式模板函數特是有些陰暗的角落裏,但這裏是你怎麼做:

template< typename T > int f(){ ... } 

template<> int f<int>(){ ... } 
template<> int f<char>(){ ... } 

一些相關閱讀:http://www.gotw.ca/gotw/049.htm

+0

謝謝。我曾猜測 - 嘗試過這一點,但我的鏈接器一直在說有多個定義的符號? – imallett

+0

你在一個頭文件中寫過這些文件,並且包含在幾個翻譯單元中?從這個意義上講,模板函數的顯式特化就像是一個常規函數。你將不得不將它們定義爲「inline」,或者在一個未命名的命名空間(C++「靜態」等價物)中定義它們。否則,只需在頭文件中聲明它們並在cpp文件中定義它們。 –

+0

是在標題中;但包括守衛。我能夠使用一個未命名的命名空間xor內聯。然而,當我去解決第二個問題時(將它變成一種方法),它再次失敗(嘗試內聯)。至於把它放在一個.cpp文件中,iirc在C++實現中分離模板沒有問題? – imallett

2

首先是,即使語法可能嗎?我感覺就是這樣。

它,但不要過分複雜的事情–這個只需要簡單的重載:

int f() 
{ 
    return /* default, typeless implementation */; 
} 

template<typename T> 
int f() 
{ 
    return /* type-specific implementation */; 
} 

template<> 
int f<char>() 
{ 
    return /* char implementation */; 
} 

template<> 
int f<int>() 
{ 
    return /* int implementation */; 
} 
+0

如何爲int或char或其他定義不同的功能?抱歉;也許我錯過了一些東西。 – imallett

+0

@Ian:然後你會專注於編輯,或者在主模板中使用編譯時常量'if'語句。沒有一個具體的目標就很難給出具體的指導...... – ildjarn

+0

「沒有一個具體的目標很難給出具體的指導。」是啊;我爲此責怪自己。你的編輯基本上是我們想到的。不明白爲什麼第一個非模板化功能是必要的。感謝您的幫助! – imallett