1

私は、さまざまなケースでさまざまな関数を使用する必要があり、これらの関数を広範囲に使用する必要があるプログラムを作成しています。ですから、そのための最善の方法は、関数を引数として渡すことだと思っていました。どちらも二重機能です。ただし、各関数に必要な引数の数は異なります。どうすればいいですか?プログラムの基本的なシナリオを以下に示します。

if (A > B){
func(double x, double y, double func_A(double a1, double a2));
}else{
func(double x, double y, double func_B(double b1, double b2, double b3));
}
4

3 に答える 3

4

関数funcをオーバーロードして、さまざまなコールバックをパラメーターとして受け取ることができます。

double func_A(double a1, double a2)
{
    return 0;
}
double func_B(double a1, double a2, double a3)
{
    return 0;
}

typedef double (*FUNCA)(double,double);
typedef double (*FUNCB)(double,double,double);

void func(double x, double y, FUNCA)
{
}
void func(double x, double y, FUNCB)
{
}

int main()
{
    func(0,0,func_A); //calls first overload
    func(0,0,func_B); //calls second overload
}
于 2012-07-19T07:35:22.403 に答える
0

C++ では関数のオーバーロードが許可されているので、そのまま使用してください。Luchian Grigore が例を示しました

于 2012-07-19T08:38:14.083 に答える
0

double(double, double)これを行う簡単な方法の 1 つは、 func のオーバーロードで、 andへの個別のポインターを受け入れる単純な実装関数を呼び出すことdouble(double, double, double)です。適用できないものは NULL になります...

void func_impl(double x, double y, double (*f)(double, double), double (*g)(double, double, double))
{
    ...
    if (...)
         f(a, b);
    else
         g(a, b, c);
    ...
}

void func(double x, double y, double (*f)(double, double))
{
    func_impl(x, y, f, NULL);
}

void func(double x, double y, double (*g)(double, double, double))
{
    func_impl(x, y, NULL, g);
}

void caller(...)
{
    ...
    if (A > B)
        func(x, y, func_A);
    else
        func(x, y, func_B);
} 
于 2012-07-19T09:35:32.757 に答える