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 に渡すのは理想的ではありません。一方、A は、私が作成するプログラムごとにカスタマイズされます。Bがゴチャゴチャしててもいいけど、Aは露出する部分だからキレイにしてほしい。

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

4

1 に答える 1

3

参照を使用していますか?

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

class B
{
    A &a;

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

    // ...
};
于 2012-04-12T11:08:26.793 に答える