0

私の問題は次のとおりです。1つの関数をパラメーターとして受け取る関数があります。問題は、場合によっては、渡された関数 fEval() を fEval(somevalue1,somevalue2) として 1 つではなく 2 つのパラメーターで呼び出す必要があることです。

Func(double (*fEval)(double F1),double min, double max,...)
{
    double value1 = fEval(10);

    // do something here

    double value2 = fEval(20,30);
}

Func 関数を実装する正しい方法は何でしょうか? 私もそれができないことを知っています

Func(double (*fEval)(double F1),double min, double max,...)

また

Func(double (*fEval)(double F1,double F2),double min, double max,...)

ありがとう !

さて、問題を言い換えましょう。最初のパラメーターとして 1 つの未知の関数、2 つの異なる値、および引数リストを取ることができる関数を作成する必要があります。何かのようなもの

double Function(RandomFunction, val1, val2, ...);

ランダム関数は次のいずれかになります。

double Func1(double x)
{
    m_x = x;
    //Calling function
    // Set other things
}
double Func2(double x,double y)
{
    m_y = y;
    m_x = x;
    //Calling function
    // Set other things
}

そのファンクターの方法を試してみますが、これが正しい方法かどうかわかりませんか? 呼び出される可能性のある関数内で () をオーバーロードする必要はありませんか?

4

1 に答える 1

7

operator()おそらく、 1 つまたは 2 つの引数を取るためにオーバーロードされたファンクターが必要になるはずです。

struct Functor {
    double operator()(double d) {
        ....
    }

    double operator()(double d1, double d2) {
        .... 
    }
};

void Func(Functor f, double min, double max, ...) {
    double value1 = f(10);

    // do something here

    double value2 = f(20, 30);
}

それ以外(1つまたは2つの引数で呼び出されているかどうかを知ることができなかったので良くない可変引数関数を渡す以外に)を取ることができる関数を持つ別の良い方法はないと思います1 つまたは 2 つの引数の両方。

また、ildjarn がコメントで述べたように、それをテンプレートにして、あらゆる種類のファンクタを使用できるようにすることもできます。

template<typename Functor_t>
void Func(Functor_t f, double min, double max, ...) {
    // same as above
}
于 2012-05-01T19:53:57.577 に答える