0

いくつかのトリッキーなコードがあり、ピースに行き詰まっています。

仮想基本クラスから派生した関数があります。

その関数の中にファンクターがあります。ファンクターは、この関数とその親クラス内のすべてのオブジェクトにアクセスできる必要があります。しかし、「this」または関数名への参照を渡すと、エラーが発生します。

この複雑さの理由は、コードを高速化するためです。私がコーディングしているアルゴリズムには、実際には高価な部分が 1 つしかありません。私の意図は、その部分を並列化することです。ただし、そのステップは、いくつかのステップを介して、 2 つの値を同時に累積します。そのため、いくつかの演算子をオーバーライドする必要があります。ファンクターは、これを実装する最も簡単な方法のように思えました。

誰でもこれを解決する方法を提案できますか?

以下代表コード:

myClassA Glm{
public:
    virtual int functionA(int a, int b)=0;
}

class myClassB : public myClassA {
    public:
    virtual int functionA(int a, int b);
}

int functionA(int a, int b){


    // do some stuff

    struct MyFunctor : public binary_function<Fraction, DoubleIterator, Fraction> {

        MyFunctor(myClassA& in_class, int A) : myClassA(in_class), column(iColumn) {

        }                
        myClassA& myClassA;
        int A;

        Fraction operator()(double B, int A, ) {

            double C = doFancyStuff(A,B);
            return C;
        }

    }

    //use stl to accumulate
    accumulate(data.begin(), data.end(), temp, MyFunctor(*this,  column) );

}
4

1 に答える 1

1

ここでの主な問題は、時期尚早の最適化です。

技術的には、現在の…

int functionA(int a, int b){

と …

int myClassB::functionA(int a, int b){

少なくともあなたの問題はthisなくなるはずです。

次に、あなたのようなデータメンバーとして参照を配置することではありません…

myClassA& myClassA;

インスタンスを割り当て不可にします。そして、ファンクター オブジェクトは代入可能である必要があります。したがって、これを続けることにした場合は、おそらくそれを…に置き換えたほうがよいでしょう。

myClassA* pMyClassA_;

それに応じて初期化を変更します。

乾杯 & hth.,

于 2011-10-28T10:08:18.980 に答える