关于函数模板和函数指针的一道题

虽然我现在还没AC此题……
2018程设期中考试的A07

输入
第一行是整数n,表示有n组数据
每组数据有2行
第一行是10个整数
第二行是4个不带空格的字符串,它们之间用空格分隔
输出
先输出10个整数里面的第3个到第7个的平方和
再输出10个整数里从第3个到第7个,按照字符串的方式,顺序连接的结果
再输出4个字符串里,第1个到第4个串中,所有字符的ASCII码加和得到的整数
再输出4个字符串里,第1个到第4个串,分别复制一遍后,按照字符串的方式,顺序连接的结果。
样例输入
1
1 2 3 4 5 6 7 8 9 10
Machine , Learning !
样例输出
135
34567
1586
MachineMachine,LearningLearning!!

程序填空。

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
// 在此处补充你的代码
string int2string(int x) { return to_string(x); }
int int2squareint(int x) { return x * x; }

int string2int(string str) {
	int res = 0;
	for (string::iterator iter = str.begin(); iter != str.end(); ++iter)
		res += *iter;
	return res;
}
string string2longerstring(string str) { return str + str; }

int main() {

	int t;
	cin >> t;
	while (t--) {
		int b1[10];
		for (int i = 0; i < 10; ++i)

			cin >> b1[i];
		A<int, 10> a1 = b1;
		cout << a1.sum(2, 6, int2squareint) << endl;
		cout << a1.sum(2, 6, int2string) << endl;

		string b2[4];
		for (int i = 0; i < 4; ++i)
			cin >> b2[i];

		A<string, 4> a2 = b2;
		cout << a2.sum(0, 3, string2int) << endl;
		cout << a2.sum(0, 3, string2longerstring) << endl;
	}
	return 0;
}

关键就是写那个sum函数。我编译迟迟过不了。

template <class T2>
		T2 sum(int b, int e, T2 func) {
			static T2 s;
			for (int i = b; i <= e; i++) {
				s = s + func(*(pointer + i));
			}
			return s;
		}

这是一开始写的函数。注意那个T2不是函数声明时候的类型比如string或者int,在例子中是string*(int)。哦对,如果把T x直接写T的话本地跑也没什么问题。然后把s前面的T2改成T3更过不了……提醒自己别犯这种弱智错误了。
参考了别人的代码,所以如果要根据函数返回值确定某局部变量类型的话要重新写函数指针的模板,不能直接一个T过去。最后的答案:

class A{
	public:
		T *pointer;
		A(T* p): pointer(p) {}
		template <class T2>
		T2& sum(int beginpos, int endpos, T2 (*func)(T x)) {
			static T2 s ;
			for (int i = beginpos; i <= endpos; i++) {
				s = s + func(*(pointer + i));
			}
			return s;
		}
};

我猜应该是s的初始化问题导致WA,实在想不出有什么其他理由了。但是如果我直接加s=0又会出现runtime error,心累……暂时还没想到有什么解决办法。

猜你喜欢

转载自blog.csdn.net/weixin_44288817/article/details/89842085