我正在尝试创建一个解析XML的函数,并使用模板返回std::string
或int
。我想出了以下代码:
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
。使用模板有更好更清洁的方法吗?谢谢!
答案 0 :(得分: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);
}
答案 1 :(得分: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
}