Я пытаюсь вызвать перегруженную функцию, которая работает с указателями на функции, параметры которых имеют значения по умолчанию.
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 всегда будет вызываться только без параметров.
На самом деле, есть больше перегруженных функций, так как тип возвращаемого значения отличается, но я могу отбросить это проще.
Краткий ответ: нет. Актерский состав легален, но единственное
вы можете сделать с результатами, чтобы привести их обратно в оригинал
тип. Аргументы по умолчанию не изменяют подпись
функция. Они входят только в учетную запись на сайте вызова, где
они передаются, если клиент не предоставляет аргумента.
сама функция всегда вызывается с полным набором аргументов,
что это явно не будет, если вы называете это через результаты
В ролях.
Обычный ответ здесь, если у вас есть контроль над источниками, это
используйте перегрузку вместо аргументов по умолчанию. (Я слышал
аргументы, что вы всегда должны использовать перегрузку вместо
аргументы по умолчанию.) Так
void originalFunction1( int a ) { ... }
void originalFunction1() { originalFunction1( 0 ); }
вместо того, что у вас есть.
Кроме того, вы можете играть в игры с шаблонами:
template <typename FunctionPtr>
void overloadedFunction( FunctionPtr fptr )
{
fptr();
}
Я предпочел бы первое решение, если вы можете использовать его, однако.
Других решений пока нет …