たとえば、int compute ( int x1, int x2, int (* op) (int, int) )という関数があり、これは算術演算を行う関数への関数ポインタを引数として取ります
int add (int a1, int a2)
{
return (a1 + a2);
}
int mul (int s1, int s2)
{
return (s1 * s2);
}
int compute (int x1, int x2, int (* op) (int, int) )
{
return ( op (x1, x2) );
}
main()
{
int result;
int op1, op2;
op1 = 4;
op2 = 5;
result = compute (op1, op2, &add());
result = compute (op1, op2, &mul());
}
このすべての関数ポインターの代わりに、関数ポインターの代わりにフラグを引数として使用して、同じことを達成することもできます。
int compute (int x1, int x2, int opFlag)
{
if ( opFlag == 1 )
return ( add (x1, x2); );
if ( opFlag == 2)
return ( mul (x1, x2); );
return 1;
}
main()
{
int result;
int op1, int op2;
op1 = 4;
op2 = 5;
result = compute (op1, op2, 1);
result = compute (op1, op2, 2);
}
ここで問題は、効率、コードサイズ、移植性、読みやすさなどの点で、 「関数ポインター」アプローチと「単純なフラグアプローチ」の(ad/disad)利点は何ですか?