デフォルト値を持つパラメーターを持つ関数ポインターで動作する、オーバーロードされた関数を呼び出そうとしています。
void originalFunction1 (int a = 0) {printf("I'm #1 and a is %d",a);}
void originalFunction2 () {printf("I'm #2");}
void overloadedFunction (void (*fptr)(void))
{
fptr();
}
void overloadedFunction (void (*fptr)(int))
{
overloadedFunction( (void(*)(void)) fptr);
}
int main()
{
overloadedFunction(originalFunction1);
overloadedFunction(originalFunction2);
// output is:
// I'm #1 an a is -1073743272
// I'm #2
}
この質問への回答が指摘しているように、デフォルト値は関数シグネチャの一部ではなく、(関数ポインター -) パラメーター定義中に繰り返すこともできません。私の例が示すように、呼び出しのためにキャストすることはできますが、デフォルト値に初期化されることはありません。
これを回避する方法はありますか?
元の関数を変更することはできませんが、デフォルト値は知っています。メインのオーバーロードされた関数とリダイレクトの両方を変更できます。fptr は、常にパラメーターなしでのみ呼び出されます。実際には、戻り値の型も異なるため、オーバーロードされた関数はもっとありますが、より簡単にキャストできます。