此功能的参数是什么意思?有人可以举例说明如何调用这个函数吗?
template<int N, int K> void poly_multiply(int (*p1)[N], int (*p2)[K], int (*p3)[N+K-1]){
}
答案 0 :(得分:4)
int (*p1)[N]
p1
是指向N个int数组的指针。与普通&#34;阵列不同#34;参数,例如:
void foo(int arr[], int arr2[10])
保留数组的类型(包括大小)。它不会降级为指向int的指针。您还可以引用数组:
int (&r1)[N]
int (&r2)[N+K-1]
答案 1 :(得分:2)
int (*p)[N]
形式的声明意味着 p
是一个指向N个int数组的指针。读取这些声明很棘手 - 你先从标识符开始然后去在没有更多的情况下向右跳并向左跳,同时遵守括号引入的优先顺序。谷歌“螺旋规则”获取更多信息。 Here's另一种阅读宣言的方式(James Kanze的答案)。
一个例子:
template<int N, int K>
void poly_multiply(int (*p1)[N], int (*p2)[K], int (*p3)[N+K-1])
{
}
int a[5]; // N = 5
int b[10]; // K = 10
int c[14]; // 10+5-1 = 14
poly_multiply(&a, &b, &c);
因为poly_multiply
是一个函数模板,它允许你传递任何大小的数组的指针,只要第三个数组的大小加起来为N + K-1 - 否则编译器会给你一个错误。将自动推导出大小N和K(除非您选择明确指定模板参数)。
请注意,您需要获取数组的地址,并且无法调用poly_multiply(a,b,c);
之类的函数,因为在这种情况下,数组会衰减指向第一个元素(int*
)和功能不会匹配。
答案 2 :(得分:1)
template<int N, int K>
void poly_multiply(int (*p1)[N], int (*p2)[K], int (*p3)[N+K-1]);
有三个参数:
指向N
int
s
指向K
int
s
指向N+K-1
int
s
请注意,后者是非推断的上下文。这意味着,对于调用的最后一个参数,N
和K
都不会被推导出来 - 因此,特化的最后一个参数的类型仅取决于调用的前两个参数的类型。
示例:
int arr1[2];
int arr2[3];
int arr3[4];
poly_multiply(&arr1, &arr2, &arr3);
poly_multiply(&arr1, &arr2, &arr2); // Error! Pointer to int[3] cannot be
// converted to pointer to int[4]