我有一个功能模板和main如下:
template <class type > type* calculate(type inputVal) {
type val;
static int counter = 0;
static type sum = inputVal;
static type average = inputVal;
static type* address = &sum
do {
cout << "Enter value: ";
cin >> val;
counter++;
sum += val;
average = sum / counter;
} while (!cin.eof());
return address;
}
void main() {
int num;
cout << "Enter Value: ";
cin >> num;
int *ptr = calculate(num);
cout << "SUM: " << *ptr << " AVG: " << *(ptr+1);
}
我的问题是,这应该适用于不同的输入类型,而不仅仅是int,所以如果用户首先输入一个浮点数,它将把所有内容都视为该类型,就像用户输入一个char一样。
模板功能也无法打印结束值。
答案 0 :(得分:1)
正常变量sum
被视为指针aritimetic(N3337 5.7添加运算符)的单元素数组,当ptr
指向它时,ptr+1
不会指向有效对象,因此不得取消引用。
如果您想要连续的内存区域,请使用数组。
另请注意
!cin.eof()
和sum
后检查average
似乎不太好主意,因为它会使用无效(重复)数据。在处理数据之前检查输入是否成功。void main()
(或main
的返回类型不是int
)是非法的。除非您有某些特殊原因 - 例如,您的老板或老师禁止编写符合标准的代码 - 您应该使用int main()
(在这种情况下)。counter
初始化为1
,以便将inputVal
放入该号码中。避免将输入作为参数以避免编写重复代码似乎更好。试试这个:
#include <iostream>
using std::cin;
using std::cout;
template <class type > type* calculate(type inputVal) {
type val;
static int counter = 1;
static type buffer[2];
type& sum=buffer[0];
type& average=buffer[1];
sum=average=inputVal;
static type* address = buffer;
for(;;) {
cout << "Enter value: ";
if(!(cin >> val)) break;
counter++;
sum += val;
average = sum / counter;
}
return address;
}
int main() {
int num;
cout << "Enter Value: ";
cin >> num;
int *ptr = calculate(num);
cout << "SUM: " << *ptr << " AVG: " << *(ptr+1);
}
或者没有来自参数的输入:
#include <iostream>
using std::cin;
using std::cout;
template <class type > type* calculate() {
type val;
static int counter = 0;
static type buffer[2];
type& sum=buffer[0];
type& average=buffer[1];
sum=0; // the type used has to be capable to be converted from integer 0
average = 0;
static type* address = buffer;
for(;;) {
cout << "Enter value: ";
if(!(cin >> val)) break;
counter++;
sum += val;
average = sum / counter;
}
return address;
}
int main() {
int *ptr = calculate<int>();
cout << "SUM: " << *ptr << " AVG: " << *(ptr+1);
}