1
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>

using namespace std;

template <class T>
T Summation(T a, T b, T c) {
  return (a+b+c);
}

int main () {
  char e = '5', f = '6', g = '7', h;
  int a = 5, b = 6, c = 7, d; 

  h=Summation<char>(e,f,g);
  cout << h << endl;
  d=Summation<char>(a,b,c);
  cout << d << endl;
}

我必须使用求和模板,并且需要打印出与参数相同类型的 18 个。所以程序应该返回 18 作为 char 类型,然后下一行应该返回 18 作为 int 类型。

4

3 回答 3

2

最简单的方法是根本不使用模板,只需执行以下操作:

    int Summation(int a, int b, int c)
    {
      return a + b + c;
    }

    int Summation(char a, char b, char c)
    {
      return a - '0' + b - '0' + c - '0';
    }

但是如果你必须使用模板:

    template <class T>
    int Summation(T a, T b, T c)
    {
      T offset = std::is_same<T, char>::value ? '0' : 0;
      return a - offset + b - offset + c - offset;
    }

请注意,从具有 char '18' 的意义上讲,您不能将 18 作为 char 返回(实际上这是一个多字符文字,但它们不可移植),因此int无论T我上面的示例中的类型如何,该函数都会返回 an 。

编辑

调用方式是这样的:

    char e = '5', f = '6', g = '7';
    int a = 5, b = 6, c = 7;
    cout << Summation(a,b,c) << endl;
    cout << Summation(e,f,g) << endl;

不要指定要使用的类型(即,不要这样做Summation<char>(...)),编译器可以自己计算出来,并且应该尽可能地这样做。
如果您将结果类型存储在 a 中char并用它打印出来,cout它将打印 achar并且(char)18不是 ascii 字符,您得到的内容取决于您的控制台。确保在int打印时类型为 an 18,这两种情况都会出现。

于 2013-10-04T17:09:51.883 回答
2

您可以对大多数类型使用通用模板,并为 char 添加一个特化:

template <class T>
T Summation(T a, T b, T c) {
  return (a+b+c);
}

template <>
char Summation<char>(char a, char b, char c) {
  return ((a - '0') + (b - '0') + (c - '0') );
}

用法(就像您在示例中一样,只是类型由编译器推断):

 char e = '5', f = '6', g = '7', h;
  int a = 5, b = 6, c = 7, d; 

  h= Summation(e,f,g);
  d= Summation(a,b,c);
于 2013-10-04T17:36:10.577 回答
-2

目前尚不清楚您是否需要模板元编程或什么,一个简单的解决方案类似于:

template <char A, char B, char C>
int char_sum()
{
  return (A-'0')+(B-'0')+(C-'0');
}

std::cout << "sum is " << char_sum<'5','6','7'>() << std::endl;

请注意,如果我没记错的话,可以安全地假设数字是A-'0'按照 ISO 标准规定的连续值编码的(安全操作也是如此)。

于 2013-10-04T16:55:07.540 回答