но он может принимать только те же функции. в этом случае у (). он не может принимать два или более типов функций одновременно. например: f1 (a) и f2 (a, b). Итак, я должен сделать все функции одного типа, потому что он не может принимать различные типы.
Да, потому что иначе, каковы будут аргументы? Другими словами, ваши fun1
и fun2
не принимают параметров. Если вы хотите вызвать fun3
, который принимает 1 параметр, каким будет аргумент?
Другими словами, рассмотрим:
void fun3(int);
y = fun3;
y(???);
Для некоторых значений y
вам придется передавать различное количество аргументов. То же самое для типа возврата.
То, что вам нужно сделать, это создать функцию-обертку, которая выполняет то, что называется частичное приложение , например. fun3
void g() {
fun3(42);
}
y = g;
y();
Здесь g
несет ответственность за знание аргументов fun3
(они могут быть постоянными, как в этом примере, или поступать откуда-то еще).
В языках, которые поддерживают определяемые пользователем типы (и, возможно, ООП), таких как C ++, типичным решением является создание "Callable" объекта, который хранит аргументы как члены данных и может вызываться так, как если бы это была функция.
Кроме того, в некоторых из этих языков вы получаете некоторый синтаксический сахар для простого создания этих вызываемых объектов на месте, обычно называемых лямбдами или замыканиями.