Один вопрос о определении функции в С++

Я читаю некоторый материал о указателе функции в С++ и сталкиваюсь с одним определением функции, которое я не понимаю.
Стандартное определение функции имеет вид:

type name (param...)

Но следующее определение кажется мне немного странным. Может ли кто-нибудь объяснить это мне? Спасибо.

float (*GetPtr1(const char opCode)) (float, float)<br>
{
    if(opCode == '+')
        return &Plus;
    else
        return &Minus; // default if invalid operator was passed
}


Примечание. Плюс и минус - это две функции с параметром (float, float) и возвратом float.

Ответ 1

Правило для чтения волосатых объявлений должно начинаться с самого левого идентификатора и работать с вами, помня, что привязка () и [] до * (т.е. *a[] - массив указателей, (*a)[] - указатель на массив, *f() - это функция, возвращающая указатель, а (*f)() - указатель на функцию):

        GetPtr1                                       -- GetPtr1
        GetPtr1(                 )                    -- is a function 
        GetPtr1(           opCode)                    -- taking a single parameter named opCode
        GetPtr1(const char opCode)                    -- of type const char
       *GetPtr1(const char opCode)                    -- and returning a pointer
      (*GetPtr1(const char opCode)) (            )    -- to a function
      (*GetPtr1(const char opCode)) (float, float)    -- taking two parameters of type float
float (*GetPtr1(const char opCode)) (float, float)    -- and returning float

Итак, если opCode равно '+', GetPtr1 вернет указатель на функцию Plus, а если он - ', он вернет указатель на функцию Minus.

Синтаксис объявления C и С++ является ориентированным на выражение (так как Бьярне хотел бы притвориться иначе); форма объявления должна соответствовать форме выражения, так как она будет использоваться в коде.

Если у нас есть функция f, которая возвращает указатель на int, и мы хотим получить доступ к указанному значению, мы выполняем функцию и разыгрываем результат:

x = *f();

Тип выражения *f() равен int, поэтому декларация/определение для функции

int *f() { ... }

Теперь предположим, что у нас есть функция f1, которая возвращает указатель на указанную выше функцию f, и мы хотим получить это целочисленное значение, вызвав f1. Нам нужно вызвать f1, устранить результат (который является функцией f) и выполнить его, а затем разыменовать этот результат (поскольку f возвращает указатель):

x = *(*f1())(); // *f1() == f, so (*f1())() == f() and *(*f1())() == *f()

Тип выражения *(*f1())() равен int, поэтому определение/определение для f1 должно быть

int *(*f1())() { return f; }

Ответ 2

GetPtr1 - это функция, которая выполняет код операции char и возвращает указатель на функцию. Возвращаемая функция принимает два поплавка и возвращает float.

Много раз легче читать, если вы делаете что-то вроде этого:

typedef float (*FloatOperationFuncPtr) (float, float);

FloatOperationFuncPtr GetPtr1(const char opCode)
{
    if(opCode == '+')
        return &Plus;
    else
        return &Minus; // default if invalid operator was passed
}

Ответ 3

Всегда приятно знать о http://cdecl.org для таких ситуаций. Имейте в виду, что он работает только при удалении имен параметров. Это то, что вы получаете за float(*GetPtr1(const char ))(float, float):

объявить GetPtr1 как функцию (const char) вернуть указатель на функцию (float, float) return float

Ответ 4

Это функция, которая принимает const char и возвращает указатель на функцию, которая принимает float, float и возвращает float.

Ответ 5

Это означает функцию, которая принимает символ и возвращает указатель на функцию, которая принимает два поплавка и возвращает float.

Ответ 6

GetPtr1 - это функция, которая принимает два параметра float в качестве входных параметров и возвращает указатель на функцию. Это намного яснее:

typedef float(*Func)(float, float);


Func GetPtr1(const char opCode)
{
    if(opCode == '+')
        return &Plus;
    else
        return &Minus; // default if invalid operator was passed
}