配列のサイズを検出する必要があるメタプログラミング テンプレートを作成する必要があります。したがって、配列のサイズを検出するテンプレート:
template<typename T, size_t N>
size_t arraylen( T(&)[N] )
{ return N; }
これは正常に機能しますが、このテンプレートでは機能しません
//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 i 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(double*&)' の呼び出しに一致する関数がありません
N i M の const 値を入力すると、次のように機能します。
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 は正常に動作しますが、私のテンプレートでは何が間違っていますか?
PS 配列は C スタイルであり、std::vector などのような C++ はありません。