#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类型。
答案 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标准规定的。