1

配列のサイズを検出する必要があるメタプログラミング テンプレートを作成する必要があります。したがって、配列のサイズを検出するテンプレート:

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++ はありません。

4

2 に答える 2