我有一個功能強制功能模板/函數重載爲特定類型
foo(int, int, int, int/long long/_int64/double/long double/char *, int ONLY IF previous char * - otherwise unneeded)
問題是,字符*實現要比值類型,由於進行字符串拷貝不同。是的,這是一箇舊代碼的接口,所以我不能使用std :: string:/
目前,我已經把它作爲模板,並且有一個函數重載char *,並帶有額外的參數。但是,其他類型的所有操作在char *上也是有效的,所以如果調用者忘記了最後一個參數,則該函數默默地匹配模板,而不是產生錯誤的邏輯。
有沒有什麼辦法可以強制使用函數模板中的重載/使用默認參數/這將允許特定類型的不同簽名(額外參數),而不會默認匹配較小的簽名?
更多: 尚未獲得C++ 11的許可,但我很樂意看到使用它來幫助推動採用的建議。 沒有提升,但與上面相同
我也曾嘗試
return_type foo(int,int,int,typename std::enable_if<!std::is_pointer<T>::value, T>::type & value2update)
沒有任何的運氣。然後它聲稱帶雙&參數的呼叫無法匹配。
你是什麼意思,「否則不需要」?這應該通過重載輕鬆實現。 – Xeo 2013-03-01 23:42:01
我假設額外的'int'是一個長度?你可以採取[StringPiece](http://code.google.com/p/re2/source/browse/re2/stringpiece.h)來避免完全需要特殊外殼? – 2013-03-01 23:43:07
@Xeo,是的,我只是想避免每種類型的代碼重複,所以想要templatize其他類型,這些都共享完全相同的代碼。 @ Scott Lamb,是的,肯定這是一個有效的 - 也許是最好的選擇。然而,這種集成將發生在代碼庫的大約3000個地方,所以不得不在調用代碼中添加StringPiece創建邏輯,這是我想避免的。我只是希望有一些事情我做錯了強制專業化 - 必須更徹底地調查Thomas的答案 – 2013-03-04 15:39:56