2017-01-16 3 views
0

でテンプレートで関数ポインタを交換しますすなわち、すべての機能を保存し、行列を埋めるために、関数ポインタの配列を使用できます。私は次のように、行列のエントリを埋めるためにC++ 11のコードを自動生成するスクリプト(Pythonのシンボリックツールボックス)を有するC++ 11

typedef double (*FillFunction) (double a, double b); 

double J00(double a, double b) {return a+b;} 
double J01(double a, double b) {return a-b;} 
double J10(double a, double b) {return -a+b;} 
double J11(double a, double b) {return -a-b;} 

void main() 
{ 
    FillFunction J[2][2] = {{J00, J01}, {J10, J11}}; 

    param0 = 0; 
    param1 = 1; 

    double Jresult[2][2]; 

    for(int i = 0; i < 2; i++) 
    { 
     for(int j = 0; j < 2; j++) 
     { 
      Jresult[i][j] = J[i][j](param0, param1); 
     } 
    } 
} 

しかし、これは私のコードのパフォーマンスの重要な一部であり、私はこのようにではなく、特に以来、関数ポインタを使用していないだろうすべての関数はコンパイル時に認識されています。テンプレートなどでこれを行うためのきちんとした方法はありますか?

注:私はこのコードをコンパイルしていないので、実際にはうまくいくかどうかはわかりませんが、あなたがそのアイデアを得ることを願っています。

+0

を、あなたは、単に 'constexpr'機能を作成することができます。 – Jarod42

+0

C配列の代わりに 'std :: array 、2u>'を使用できますか? – Jarod42

+1

行列全体を埋める* once *関数を生成しないのはなぜですか? – immibis

答えて

1

あなたはこの生成し、とにかく外部のコードジェネレータを使用している場合:C++ 14で

double Jresult[2][2] = { 
    {J00(param0, param1), J01(param0, param1)}, 
    {J10(param0, param1), J11(param0, param1)}, 
}; 
関連する問題