Будет ли работать отбрасывание параметров в указателе функции с параметрами по умолчанию?

Я пытаюсь вызвать перегруженную функцию, которая работает с указателями на функции, параметры которых имеют значения по умолчанию.

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 всегда будет вызываться только без параметров.
На самом деле, есть больше перегруженных функций, так как тип возвращаемого значения отличается, но я могу отбросить это проще.

6

Решение

Краткий ответ: нет. Актерский состав легален, но единственное
вы можете сделать с результатами, чтобы привести их обратно в оригинал
тип. Аргументы по умолчанию не изменяют подпись
функция. Они входят только в учетную запись на сайте вызова, где
они передаются, если клиент не предоставляет аргумента.
сама функция всегда вызывается с полным набором аргументов,
что это явно не будет, если вы называете это через результаты
В ролях.

Обычный ответ здесь, если у вас есть контроль над источниками, это
используйте перегрузку вместо аргументов по умолчанию. (Я слышал
аргументы, что вы всегда должны использовать перегрузку вместо
аргументы по умолчанию.) Так

void originalFunction1( int a ) { ... }
void originalFunction1() { originalFunction1( 0 ); }

вместо того, что у вас есть.

Кроме того, вы можете играть в игры с шаблонами:

template <typename FunctionPtr>
void overloadedFunction( FunctionPtr fptr )
{
fptr();
}

Я предпочел бы первое решение, если вы можете использовать его, однако.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]