2013-02-11 170 views
0

我試圖創建一個函數來解析XML並使用模板返回std::stringint。我想出了下面的代碼:使用模板從函數返回不同的數據類型

template <class T> 
T queryXml(char *str) 
{ 
    if (typeid(T) == typeid(int)) 
     return evalulate_number(doc); 
    else 
     return evaluate_string(doc); 
} 

...並調用這樣的功能:

queryXml<int>("/people/name"); //I would like an int returned 
queryXml<std::string>("/people/name"); //I would like a string returned 

但我得到的錯誤說cannot convert pugi::string_t{aka std::basic_string<char>} to int in return。有沒有更好,更乾淨的方式來使用模板來做到這一點?謝謝!

+1

模板功能instantialized作爲一個整體所以這是行不通的 - 如果我把任何類型的像它不會工作返回類型。 – Csq 2013-02-11 01:49:25

回答

6

模板專業化。

// The general form in your algorithm is to use a string... 
template <class T> 
T queryXml(char *str) 
{ 
    return evaluate_string(doc); 
} 

// ...and you want special behavior when using an int 
template <> 
int queryXml(char *str) 
{ 
    return evalulate_number(doc); 
} 
2

基本上,你不能有一個具有兩種不同返回類型的函數。但是,您可以擁有多個具有相似名稱和不同返回類型的函數。您可以通過函數重載或模板特化完成此操作。在你的情況下,函數重載不能被使用,因爲你想爲所有返回類型使用相同的函數簽名。

這裏是你會如何專注模板每個預期類型:

#include <string> 

int evaluate_number() { return 87; } 
std::string evaluate_string() { return "hi\n"; } 

template <class T> 
T queryXml(const char *str); 

template<> 
int queryXml<int>(const char *str) { 
    return evaluate_number(); 
} 

template<> 
std::string queryXml<std::string>(const char *str) { 
    return evaluate_string(); 
} 

int main() { 
    int i = queryXml<int>("/people/name"); //I would like an int returned 
    std::string s = queryXml<std::string>("/people/name"); //I would like a string returned 
}