0

std::stringXML を解析し、または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。テンプレートを使用してこれを行うためのより良い、よりクリーンな方法はありますか? ありがとうございました!

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

基本的に、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 に答える