要取消雜波strtoxx調用的代碼,但仍然有他們內聯,我想有這樣一個函數模板:如何'幫助'編譯器從函數模板參數中推導出函數模板返回類型?
template <typename STR_TO_NUM> static auto StrToNum(const string& s) {
char* pEnd;
return STR_TO_NUM(s.c_str(), &pEnd, 10);
}
,並調用它像
unsigned long x = StrToNum<strtoul>("1984");
但是我得到「模板參數扣除/替換失敗:'錯誤。我可以這樣做:
template <typename T, T (*STR_TO_NUM)(const char *, char **, int)> static T StrToNum(const string& s) {
char* pEnd;
return STR_TO_NUM(s.c_str(), &pEnd, 10);
}
並指定調用時的返回類型。但感覺這是多餘的。有沒有辦法避免它?
我試着'模板typedef'STR_TO_NUM在C++ 11中使用'使用',但無法弄清楚如何爲函數類型做到這一點。
感謝
是'C++ 11'兼容,你可以通過'幫助編譯器的演繹結果類型 - > decltype(strToNum(s.c_str()的std :: declval(),10))' –
謝謝。我的意思是使用strtoxx一個值參數,並讓編譯器從中推斷出所有的東西。這樣編譯器可以內聯strtoxx我相信。 – Jeevaka
作爲一個純粹的猜測:值得嘗試鏈接時優化(或整個程序優化),在所有主要編譯器中都可用,並查看函數調用是否內聯,儘管指針指向函數。 –