Какой смысл указателей на функции? - PullRequest
83 голосов
/ 07 апреля 2010

У меня проблемы с отображением полезности указателей на функции.Я думаю, это может быть полезно в некоторых случаях (в конце концов, они существуют), но я не могу вспомнить случай, когда лучше или неизбежно использовать указатель на функцию.использование указателей на функции (в C или C ++)?

Ответы [ 16 ]

2 голосов
/ 07 апреля 2010

Функциональные указатели могут использоваться в C для создания интерфейса для программирования. В зависимости от конкретной функциональности, которая требуется во время выполнения, указателю функции может быть назначена другая реализация.

1 голос
/ 25 марта 2018

Использование указателя функции

Кому динамически вызывать функцию в зависимости от ввода пользователя Создав в этом случае карту строки и указатель на функцию.

#include<iostream>
#include<map>
using namespace std;
//typedef  map<string, int (*)(int x, int y) > funMap;
#define funMap map<string, int (*)(int, int)>
funMap objFunMap;

int Add(int x, int y)
{
    return x+y;
}
int Sub(int x, int y)
{
        return x-y;
}
int Multi(int x, int y)
{
        return x*y;
}
void initializeFunc()
{
        objFunMap["Add"]=Add;
        objFunMap["Sub"]=Sub;
        objFunMap["Multi"]=Multi;
}
int main()
{
    initializeFunc();

    while(1)
    {
        string func;
        cout<<"Enter your choice( 1. Add 2. Sub 3. Multi) : ";
        int no, a, b;
        cin>>no;

        if(no==1)
            func = "Add";
        else if(no==2)
            func = "Sub";
        else if(no==3)
            func = "Multi";
        else 
            break;

        cout<<"\nEnter 2 no :";
                cin>>a>>b;

        //function is called using function pointer based on user input
        //If user input is 2, and a=10, b=3 then below line will expand as "objFuncMap["Sub"](10, 3)"
        int ret = objFunMap[func](a, b);      
        cout<<ret<<endl;
    }
    return 0;
}

Таким образом, мы использовали указатель функции в нашей реальной балансовой единице. Вы можете написать «n» номер функции и вызвать их, используя этот метод.

ВЫВОД:

    Enter your choice( 1. Add 2. Sub 3. Multi) : 1
    Enter 2 no :2 4
    6
    Enter your choice( 1. Add 2. Sub 3. Multi) : 2
    Enter 2 no : 10 3
    7
    Enter your choice( 1. Add 2. Sub 3. Multi) : 3
    Enter 2 no : 3 6
    18
1 голос
/ 13 августа 2017

Другая точка зрения, помимо других хороших ответов здесь:

В C есть только указатели на функции, нет никаких функций.

Я имею в виду, вы пишете функции, но вы не можете манипулировать функциями. Во время выполнения нет представления функции как таковой. Вы даже не можете назвать «функцию». Когда вы пишете:

my_function(my_arg);

То, что вы на самом деле говорите, это «выполнить вызов указателя my_function с указанным аргументом». Вы делаете вызов через указатель на функцию. Этот спад до указателя на функцию означает, что следующие команды эквивалентны предыдущему вызову функции:

(&my_function)(my_arg);
(*my_function)(my_arg);
(**my_function)(my_arg);
(&**my_function)(my_arg);
(***my_function)(my_arg);

и т. Д. (Спасибо @LuuVinhPhuc).

Итак, вы уже используете указатели функций в качестве значений . Очевидно, что вы хотели бы иметь переменные для этих значений - и вот где используются все другие элементы: полиморфизм / настройка (как в qsort), обратные вызовы, таблицы переходов и т. Д.

В C ++ все немного сложнее, поскольку у нас есть лямбды, объекты с operator() и даже классом std::function, но принцип в основном остается тем же.

1 голос
/ 26 марта 2017

Для ОО-языков, чтобы выполнить полиморфные вызовы за сценой (это также верно для C до некоторой степени, я думаю).

Более того, они очень полезны для введения другого поведения в другую функцию (foo) во время выполнения. Это делает функцию foo функцией высшего порядка. Помимо гибкости это делает код foo более читабельным, поскольку он позволяет извлечь из него дополнительную логику «если-еще».

Включает много других полезных вещей в Python, таких как генераторы, замыкания и т. Д.

0 голосов
/ 27 апреля 2015

Одно использование указателя на функцию может быть в том случае, когда мы можем не захотеть изменять код, в котором вызывается функция (то есть, таким образом, вызов может быть условным, и при других условиях нам необходимо выполнить другой вид обработки).Здесь указатели функций очень удобны, поскольку нам не нужно изменять код в том месте, где вызывается функция.Мы просто вызываем функцию, используя указатель на функцию с соответствующими аргументами.Указатель на функцию может быть сделан для условного указания на разные функции.(Это можно сделать где-нибудь на этапе инициализации).Более того, приведенная выше модель очень полезна, если мы не в состоянии изменить код, из которого она вызывается (предположим, что это библиотечный API, который мы не можем изменить).API использует указатель на функцию для вызова соответствующей пользовательской функции.

0 голосов
/ 30 декабря 2010

Я широко использую указатели функций для эмуляции микропроцессоров с 1-байтовыми кодами операций. Массив из 256 указателей на функции является естественным способом реализации этого.

...