2012-04-12 14 views
1

構造上の理由から、ファンクタのインスタンスを別のファンクタに渡すことができます。現時点では、私はファンクタへのポインタをファンクタに渡すことで同等のものを実現します。私は以下のいくつかの最小限のコードでアイデアをカプセル化することを試みてきましたファンクタのインスタンスを別のファンクタに渡す

:本質的には

class A 
{ 
private: 
    double _x, _y, _z; 

public: 
    A (double x, double y, double z) : _x(x), _y(y), _z(z) {}; 

    void operator() (double t) const 
    { 
     // Some stuff in here that uses _x, _y, _z, and t. 
    } 
}; 

class B 
{ 
private: 
    // What is the type of the functor instance? 
    ??? A ??? 

public: 
    // How do I pass the instance of A into B at initialisation? 
    B (??? A ???) : ??? : {}; 

    void operator() (double tau) const 
    { 
     // Something that uses an instance of A and tau. 
    } 
}; 

int main(void) 
{ 
    // I want to do something like this: 
    A Ainst(1.1, 2.2, 3.3); // Instance of A. 
    B Binst(Ainst);   // Instance of B using instance of A. 

    Binst(1.0);    // Use the instance of B. 

    return 0 
} 

、私は、チェーンまでファンクタにできるようにしたいです。上で述べたように、私は現在、関数ポインタを変数x、y、zとともにBに渡すことでこれを行います。私のコードでは、Bはテンプレート化されています。目標は一度書き込んでから後で変更することなく再利用することです。つまり、x、y、zをBに渡すことは理想的ではありません。一方、私が書くプログラムごとにカスタマイズされます。私はBがかなり乱雑ではないが、これが公開される部分であるので、Aがすてきできれいであることを望む。

いくつかの量子力学を知っている人にとって、Bはシュレーディンガー方程式(またはマスター方程式)であり、Aは時間依存のハミルトニアンです。変数x、y、zはハミルトニアンを構築するために使用され、tは時刻であり、odeintライブラリを使用することができます(したがって、私はウブラスといくつかのブーストビットを使用しています)。

+0

std :: bindが必要です。それは、ファンクタを連鎖させ、パラメータをバインドすることができます。 – innochenti

答えて

3

参考文献を使用していますか?

class A { /* ... */ }; 

class B 
{ 
    A &a; 

public: 
    B(const A &my_a) 
     : a(my_a) 
    { } 

    // ... 
}; 
+0

素晴らしい。私がこれを最初に考えなかったことは非常に恥ずかしいことです。それにもかかわらず、あなたは私の頭をマックブックのキーボードと叩く数時間を節約しました。私は非常に*非常に感謝しています。ありがとう! – qubyte

関連する問題