2016-11-04 123 views
1

我有兩個重載函數等C++重載函數

void f(int); 
void f(std::string); 

和兩個重載函數g具有相同的原型作爲f,但它們是簡單封裝到f,因此它們的實現是完全一樣的:

void g(int n) { f(n);} 
void g(std::string n) { f(n); } 

有沒有辦法避免兩次執行g?我知道這可以通過模板像

template<typename T> g(T n) { f(n);} 

宣佈g做,但後來我不得不請在函數調用的類型像

g<int>(2); 
g<std::string>("42"); 

我信步什麼的正確方法避免在不強制用戶在每個函數調用中明確寫入類型名的情況下寫入g的執行兩次?

+1

「但是我必須在函數中鍵入類型」,不,你不必。模板參數演繹爲你做。 –

回答

4

「但是之後我必須在函數」中輸入類型,不,你不需要。 模板論證扣除爲您做到了。所以,函數模板是一個實用的解決方案。

你寫的一個,

template<typename T> g(T n) { f(n);} 

,例外的是它需要一個void返回類型的罰款。


可以支持移動的優化如下:

template< class Arg > 
void g(Arg&& arg) { f(std::forward<Arg>(arg)); } 

這裏&&不表示右值引用,但所謂的通用參考,因爲它適用於一個模板參數這已經可以作爲參考。

這樣做的效果是,std::forward在大多數情況下可以完全重現實際參數的種類,這就是所謂的完美轉發

3

有沒有辦法避免兩次執行g?

是的,有。

我知道這可以通過模板像

你去那裏宣佈G是完成。

但隨後我會在函數調用

不,你沒有輸入的類型。你可以讓編譯器推導出類型:

g(2); 
g("42");