我怎样才能得到三个字符数的总和?

时间:2013-10-04 16:46:28

标签: c++ templates

#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类型。

3 个答案:

答案 0 :(得分: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类型。

修改

调用它的方式是这样的:

    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>(...)),编译器可以自己弄清楚它,并且应该尽可能地这样做。
如果您将结果类型存储在char中并使用cout打印出来,则会打印char(char)18不是ascii字符,您获得的内容取决于您安慰。打印时确保类型为int,两种情况下都会18

答案 1 :(得分: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);

答案 2 :(得分:-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标准规定的。