我必须做一个元编程模板,我必须检测数组的大小。 数组所以模板至极检测尺寸:C++元编程检测大小数组
template<typename T, size_t N>
size_t arraylen(T(&)[N])
{ return N; }
这工作得很好,但dosent作品与此模板
//Template to calculate Vector*Vector
template<int N> double IloczynSkalarny(double *a,double *b) {
return (*a)*(*b)+IloczynSkalarny<N-1>(++a,++b);
}
template<> double IloczynSkalarny<1>(double *a,double *b) {
return (*a)*(*b);
}
//Here we calculate the row of matrix using Vector*Vector template
template<int M,size_t I> double row_vec(double *A,double *v) {
return IloczynSkalarny<M>(A+I*M,v);
}
//Looping thru matrix rows
template<int N,int M> struct matrix_vec_c {
static void matrix_vec(double *A,double *v,double *u) {
u[N-1]=row_vec<M,N-1>(A,v);
matrix_vec_c<N-1,M>::matrix_vec(A,v,u);
}
};
template<int M> struct matrix_vec_c<0,M> {
static void matrix_vec(double *A,double *v,double *u) {}
};
//Calling template
template<size_t N,size_t M> inline void matrix_vec(double A[],double v[],double u[]) {
matrix_vec_c<N,M>::matrix_vec(A,v,u);
}
此模板效果很好,当我给参数N I M这样
double x[] = {1, 1, 0};
double A[] = {1, 0, 0,
2, -5, 1};
double y[2];
matrix_vec<2,3>(A,x,y);
,但我需要调用matrix_vec这样的:
matrix_vec(A,x,y);
其中没有N个M参数传递给模板。所以我必须检测数组的大小。 所以我做模板是这样的:
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);
}
,但我得到错误:调用 'arraylen(双* &)'
当我把N个常量值I M没有匹配功能的作品:
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);
}
当然,这是没有道理的,因为传递的数组有不同的大小。 模板函数arraylen正常工作,但在我的模板dosent我做错了什么?
PS 数组在C中的风格没有类似于C++的std ::向量或其他
'return(* a)*(* b)+ IloczynSkalarny(++ a,++ b);'这是未定义的行为。 –
jrok
但这个模板工作正常我没有这个模板的问题。 – Aku
未定义的行为并不意味着它不会编译。相反,它可能不会做你期望它做的事,或者看起来随机的场合失败。 –