我必須做一個元編程模板,我必須檢測數組的大小。 數組所以模板至極檢測尺寸: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
未定義的行爲並不意味着它不會編譯。相反,它可能不會做你期望它做的事,或者看起來隨機的場合失敗。 –