使用模板从函数返回不同的数据类型

时间:2013-02-11 01:43:37

标签: c++ function templates return-value

我正在尝试创建一个解析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。使用模板有更好更清洁的方法吗?谢谢!

2 个答案:

答案 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
}