0

我正在尝试创建一个函数来解析 XML 并返回 astd::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。有没有更好更干净的方法来使用模板来做到这一点?谢谢!

4

2 回答 2

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);
}
于 2013-02-11T01:47:50.377 回答
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
}
于 2013-02-11T01:52:46.883 回答