【发布时间】:2011-05-17 09:58:59
【问题描述】:
我正在尝试学习 C++ 中的模板,而我尝试的其中一件事是编写一个 map 函数,就像你通常在函数式语言中找到的那样。这个想法是这样的:
template <class X> X * myMap(X * func(X), X * array, int size)
{
X * temp;
for(int i = 0, i < size, i++) {temp[i] = (*func)(array[i]);}
return temp;
}
但是当我尝试使用它时:
int test(int k) { return 2 * k;}
int main(void)
{
int k[5] = {1,2,3,4,5};
int *q = new int[5];
q = myMap(&test, k, 5);
for(int i=0; i<5; i++) {cout << q[i];}
delete [] q;
return 0;
}
编译时出现类型不匹配错误:
main.cpp:25: error: no matching function for call to ‘myMap(int (*)(int), int [5], int)’
我尝试将其更改为:
int main(void)
{
int *k = new int[5];
int *q = new int[5];
for(int i=0; i<5;i++) {k[i] = i;}
q = myMap(&test, k, 5);
for(int i=0; i<5; i++) {cout << q[i];}
delete [] q;
return 0;
}
错误信息变为:
main.cpp:26: error: no matching function for call to ‘myMap(int (*)(int), int*&, int)’
这可能是非常错误的事情,但我找不到在哪里。
编辑:错误:
1) 我打错了函数指针。它是 X (*func)(X) 而不是 X * func(X) 。
2)忘记分配温度。必须做X * temp = new X[size]。
3) 还有错误吗?
【问题讨论】:
-
你知道这个函数已经存在于标准库中了吧? (称为
std::transform) -
哦,是的,我只是想学习如何做到这一点。
-
您没有为新创建的数组分配任何内存。
-
您还可以通过将类型更改为
template <class X, class Y> Y * myMap(Y (*func)(X), X * array, int size)甚至template <class X, class Y, class F> Y * myMap(F func, X * array, int size)来使您的函数更通用。 -
最后一个版本看起来很漂亮!