0

我想做一个添加三个数字的模板函数。类型可以是 int 或 char 或 string。如何添加这些然后使用相同的类型返回正确的值。示例:三个数字字符串 {5,6,7} 应加起来为 18,然后将 18 作为字符串返回。数字 {5,6,7} 的三个字符加起来应为 18,然后将 18 作为字符返回。

template <class MyType>
MyType GetSum (MyType a, MyType b, MyType c) {
  return (a+b+c);
}

  int a = 5, b = 6, c = 7, d; 
  char e = '5', f = '6', g = '7', h; 
  string i= "5", j= "6", k= "7", l; 

  d=GetSum<int>(a,b,c);
  cout << d << endl;

  h=GetSum<char>(e,f,g);
  cout << h << endl;

  l=GetSum<string>(i,j,k);
  cout << l << endl;

此代码适用于 int,但显然不适用于 char 或 string。我不知道如何从未知类型转换为 int 并返回,所以我可以添加数字。

4

3 回答 3

2

您希望添加的项目好像是整数,但可能是 int、char 或 std::string。

这意味着,首先让它们成为整数,然后转换回原始类型:

template <typename T>
T sum(T t1, T t2, T t3)
{
   std::stringstream input;
   input << t1 << " " << t2 << " " << t3;
   int sum = 0;
   int item;
   while ( input >> item )
   {
      sum += item;
   }
   // at this point we have the wanted value as int, get it back in a general way:
   std::stringstream output;
   output << sum;
   T value;
   output >> value;
   return value;
}

char我会以这种方式添加 s有点小心。'18'不是完全有意义的afaik,或者可能至少依赖于平台。

您需要<sstream>在项目中包含才能使用std::stringstream.

于 2013-09-28T19:17:16.930 回答
0

您可以使用boost::lexical_cast在整数和字符串类型之间进行转换。

template <class MyType>
MyType GetSum (MyType a, MyType b, MyType c)
{
    int int_a = boost::lexical_cast<int>(a);
    int int_b = boost::lexical_cast<int>(b);
    int int_c = boost::lexical_cast<int>(c);
    int sum = int_a+int_b+int_c;
    return boost::lexical_cast<MyType>(sum);
}

如果您不允许或不想使用boost,只需自己实现功能模板lexical_cast(您将必须实现多个模板特化,但每个单独的都很容易)。

于 2013-09-28T19:02:35.267 回答
0

您可以实现显式转换模板函数,其中每个函数都通过模板特化来实现。例如:

template <typename MyType> int ToInt (MyType);
template <> int ToInt<int> (int x) { return x; }
template <> int ToInt<std::string> (std::string x) { return std::stoi(x); }
template <> int ToInt<char> (char x) { return std::stoi(std::string(&x, 1)); }

template <typename MyType> MyType FromInt (int);
template <> int FromInt<int> (int x) { return x; }
template <> std::string FromInt<std::string> (int x) {
    std::ostringstream oss;
    oss << x;
    return oss.str();
}
template <> char FromInt<char> (int x) {
    static const std::string map("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    return map.at(x);
}

然后,GetSum()将调用ToInt<>()参数,计算总和,然后调用FromInt<>()将值转换回原始类型:

template <typename MyType>
MyType GetSum (MyType a, MyType b, MyType c) {
    int aa = ToInt(a);
    int bb = ToInt(b);
    int cc = ToInt(c);
    return FromInt<MyType>(aa + bb + cc);
}

从这个演示中可以看出,对于您的同一个程序,输出为:

18
I
18

I这种情况的原因char是转换假设结果值可以表示为单个基数 36 位。

于 2013-09-28T20:10:55.410 回答