Подтвердить что ты не робот

Для чего используется тип функции?

Учитывая следующие два typedef s:

typedef void (*pftype)(int);

typedef void ftype(int);

Я понимаю, что первый определяет pftype как указатель на функцию, которая принимает один параметр int и ничего не возвращает, а вторая определяет ftype как тип функции, который принимает один параметр int и ничего не возвращает, Однако я не понимаю, для чего может быть использован второй.

Я могу создать функцию, соответствующую этим типам:

void thefunc(int arg)
{
    cout << "called with " << arg << endl;
}

а затем я могу создать указатели на эту функцию, используя каждый:

int main(int argc, char* argv[])
{
    pftype pointer_one = thefunc;
    ftype *pointer_two = thefunc;

    pointer_one(1);
    pointer_two(2);
}

При использовании типа функции я должен указать, что я создаю указатель. Используя тип указателя функции, я этого не делаю. Либо можно использовать взаимозаменяемо как тип параметра:

void run_a_thing_1(ftype pf)
{
    pf(11);
}

void run_a_thing_2(pftype pf)
{
    pf(12);
}

Какое использование, следовательно, является типом функции? Не подходит ли тип указателя функции к случаям и удобнее?

4b9b3361

Ответ 1

Как и вы укажете (основной тип указателя или ссылки на функцию), наиболее распространенные типы использования для типов функций представлены в объявлениях функций:

void f(); // declares a function f, of type void()

для которого можно использовать typedef:

typedef void ft(some, complicated, signature);
ft f;
ft g;

// Although the typedef can't be used for definitions:
void f(some, complicated, signature) {...}

и как параметры шаблона:

std::function<void()> fn = f;  // uses a function type to specify the signature

Ответ 2

Также рассмотрим этот

template<typename T>
void f(T*);

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