C++ C++;元编程检测大小数组

C++ C++;元编程检测大小数组,c++,arrays,size,detect,template-meta-programming,C++,Arrays,Size,Detect,Template Meta Programming,我必须制作一个元编程模板,在这里我必须检测数组的大小。 因此,检测阵列大小的模板: template<typename T, size_t N> size_t arraylen( T(&)[N] ) { return N; } 其中没有N i M参数传递到模板。所以我必须检测数组的大小。 所以我制作的模板如下: matrix_vec(A,x,y); inline void matrix_vec(double A[],double v[],double u[]) { i

我必须制作一个元编程模板,在这里我必须检测数组的大小。 因此,检测阵列大小的模板:

template<typename T, size_t N>
size_t arraylen( T(&)[N] )
{ return N; }
其中没有N i M参数传递到模板。所以我必须检测数组的大小。 所以我制作的模板如下:

matrix_vec(A,x,y);
inline void matrix_vec(double A[],double v[],double u[]) {
  int  N = arraylen(v);
  int M = arraylen(u);
 matrix_vec_c<N,M>::matrix_vec(A,v,u);
}
int main() { 
    int x[] = {1, 3, 5, 7, 9};
    std::cout << sum(x);
    return 0;
}
inline void matrix_vec(双A[],双v[],双u[]){
int N=arraylen(v);
int M=arraylen(u);
矩阵向量c::矩阵向量(A,v,u);
}
但我得到了一个错误:调用'arraylen(double*&')没有匹配的函数

当我将N的常量值输入到它的作品中时:

inline void matrix_vec(double A[],double v[],double u[]) {
  int const N = 3;
  int const M = 3;
 matrix_vec_c<N,M>::matrix_vec(A,v,u);
}
inline void matrix_vec(双A[],双v[],双u[]){
int常数N=3;
int const M=3;
矩阵向量c::矩阵向量(A,v,u);
}
当然,这没有意义,因为传递的数组大小不同。 模板函数arraylen运行良好,但在我的模板中,我犯了什么错误

PS
数组是C样式的,没有C++,类似于STD::vector或其他的

这是因为当你把数组传递给函数时,它们不再是数组,而是已经退化成指针。数组和指针几乎可以互换,但不同的是指针当然没有大小。

这是因为当你将数组传递给函数时,它们不再是数组,而是衰减为指针。数组和指针几乎可以互换,但不同的是,指针当然没有大小。

这至少是使用此模板的一个重要意义,它只在传递实际数组时才起作用。当您尝试在函数内部使用它时,函数参数已经从数组衰减到指针。由于无法在指针上调用模板,编译将失败

为了使事情顺利进行,您可以(例如)将函数制作成一个模板,该模板还接收对数组的引用。这将在函数本身中保留参数的“数组”性质(就像在模板中一样)

模板
大小和(t(&矩阵)[N]){
//使用矩阵。在本例中,我们将对其元素求和:
总尺寸=0;

对于(size_t i=0;i来说,这至少是使用此模板的一个重要方面——它只有在传递实际数组时才起作用。当您尝试在函数内部使用它时,函数参数已经从一个数组衰减到另一个指针。由于无法在指针上调用模板,编译失败

为了使事情顺利进行,您可以(例如)将函数制作成一个模板,该模板还接收对数组的引用。这将在函数本身中保留参数的“数组”性质(就像它在模板中所做的那样)

模板
大小和(t(&矩阵)[N]){
//使用矩阵。在本例中,我们将对其元素求和:
总尺寸=0;


对于(sisixt t=0;ISO),我必须检测这个数组的大小。@ Aku,不能,不使用正常数组。我建议您开始查看或。但是任务的规范是通过数组的,并且这些数组是C样式的,而不是C++数组和STL容器。@ Aku,然后必须将大小作为参数(模板或普通)传递。在这种情况下,我必须如何检测数组的大小?@ Aku,不能,不使用正常数组。我建议您开始查看或。但是任务的规范是通过数组,并且这些数组是C样式的,而不是C++数组和STL容器。@ Aku,然后必须将大小作为参数(模板或普通)传递。返回函数。
return(*a)*(*b)+IloczynSkalarny(+a,++b)
这是未定义的行为。但是这个模板工作正常。我对这个模板没有问题。未定义的行为并不意味着它不会编译。相反,它可能不会做你期望它做的事情,或者在看似随机的情况下失败。@Aku无论如何,你应该修复它。如果它用另一个编译器,另一个版本在你身上爆炸,不要感到惊讶编译器的版本或具有不同优化级别的版本。
return(*a)*(*b)+IloczynSkalarny(++a,++b)
这是未定义的行为。但是这个模板工作正常。我对这个模板没有问题。未定义的行为并不意味着它不会编译。相反,它可能不会做你期望它做的事情,或者在看似随机的情况下失败。@Aku无论如何,你应该修复它。如果它用另一个编译器,另一个版本在你身上爆炸,不要感到惊讶St:您的编译器或具有不同的优化级别。我知道STD::向量和C++是更好的方法,但是这里的数组是C风格的。这个代码有多个编译错误:预期的不合格ID在“之前”的“令牌”。{ Aku:OOPS——很正确。我写的是一个模糊不清的混合模板类和模板函数,它不起任何作用。我相信我已经纠正了。我知道STD:向量和C++的东西是更好的方法,但是这里的数组是C风格的。这个代码有剂量编译错误:预期的不合格ID之前。'token.In-line类matrix_-vec(T(&matrix)[N]){@Aku:Oops——非常正确。我写的是一个模版类和模版函数的混合体,两者都不起作用。我相信我现在已经纠正了这一点。
inline void matrix_vec(double A[],double v[],double u[]) {
  int const N = 3;
  int const M = 3;
 matrix_vec_c<N,M>::matrix_vec(A,v,u);
}
template <class T, size_t N>
size_t sum(T(&matrix)[N]) { 
    // use matrix. For this example, we'll sum its elements:
    size_t total = 0;
    for (size_t i=0; i<N; i++)
        total += matrix[i];
    return total;
}
int main() { 
    int x[] = {1, 3, 5, 7, 9};
    std::cout << sum(x);
    return 0;
}