2016-10-28 62 views
0

要取消雜波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中使用'使用',但無法弄清楚如何爲函數類型做到這一點。

感謝

回答

6

STR_TO_NUM在你的第一個例子是一個類型。你通過strtoul這是一個函數。您可以嘗試類似:

template <typename STR_TO_NUM> static auto StrToNum(const string& s, STR_TO_NUM strToNum) { 
    char* pEnd; 
    return strToNum(s.c_str(), &pEnd, 10); 
} 

,並稱呼其爲:

unsigned long x = StrToNum("1984", strtoul); 
+2

是'C++ 11'兼容,你可以通過'幫助編譯器的演繹結果類型 - > decltype(strToNum(s.c_str()的std :: declval (),10))' –

+0

謝謝。我的意思是使用strtoxx一個值參數,並讓編譯器從中推斷出所有的東西。這樣編譯器可以內聯strtoxx我相信。 – Jeevaka

+0

作爲一個純粹的猜測:值得嘗試鏈接時優化(或整個程序優化),在所有主要編譯器中都可用,並查看函數調用是否內聯,儘管指針指向函數。 –

2

C++ 1Z將有

template <auto STR_TO_NUM> 
static auto StrToNum(const string& s) { 
    char* pEnd; 
    return STR_TO_NUM(s.c_str(), &pEnd, 10); 
} 

,而不是

template <typename T, T STR_TO_NUM> 
static auto StrToNum(const string& s) { 
    char* pEnd; 
    return STR_TO_NUM(s.c_str(), &pEnd, 10); 
} 

及其

StrToNum<decltype(&strtoul), &strtoul>("1984");