Примеры определения функции указателя и функции обратного вызова - PullRequest
0 голосов
/ 29 мая 2018

Я изучаю функцию обратного вызова в C ++ и имею некоторые проблемы с пониманием инициализации функции обратного вызова , такой как

typedef void (CALLBACK *name)(int,int);

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

typedef void (*name)(int,int);

У меня есть простой пример того, как вызывать функцию внутри другой функции, используя объявление указателя на функцию .Пример преобразует string в int и сравнивает с anoter int.Затем говорит, какой из них больше:

#include <stdio.h>
#include <stdlib.h>

int StrToInt(char* inputchar)    //converting function
{
    int outputint;
    outputint = atoi(inputchar);
    return outputint;
}

typedef int(*p)(char*);   //declare function pointer

void IntCompare(p FuncP, char* inputchar, int b)    //comparing function
{
    int a;
    a = FuncP(inputchar);    //call converting function using function pointer

    if (a<b)
    {
        printf("%d is bigger\n", b);
    }
    else
    {
        printf("%d is bigger\n", a);
    }
}

void main()
{   
    char* StrNum = "1234";
    p FuncP;     //creat a function pointer
    FuncP = StrToInt;     //point to converting function
    IntCompare(FuncP, StrNum, 21);
}

То, что я спрашиваю:

Может ли кто-нибудь дать мне аналогичный пример о том, как использовать typedef void (CALLBACK *name)(int,int);?Пожалуйста, помогите мне понять, когда и как его использовать.Спасибо за внимание.

1 Ответ

0 голосов
/ 29 мая 2018

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

qsort, например, использует эту технику.qsort - это отдельная функция, которая может сортировать любой массив.Но вы должны сказать qsort, как сравнивать разные типы данных.Это делается путем передачи указателя функции на qsort.

int compare_int(const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

int compare_string(const void * a, const void * b) 
{
    const char *pa = *(const char**)a;
    const char *pb = *(const char**)b;
    return strcmp(pa, pb);
}

int main ()
{
  int int_array[] = { 3, 2, 1 };
  int count = sizeof(int_array) / sizeof(int);
  qsort(int_array, count, sizeof(int), compare_int);

  const char *string_array[] = { "234","123","456" };
  count = sizeof(string_array) / sizeof(char*);
  qsort(string_array, count, sizeof(char*), compare_string);

  return 0;
}

Конечно, в C ++ мы используем std::sort, который вместо этого использует шаблоны.

Но нам все еще нужно передать функции в C ++.Смотрите, например, реализацию for_each

template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
    for (; first != last; ++first) {
        f(*first);
    }
    return f;
}

Использование:

std::vector<int> nums{ 3, 4, 2, 8, 15, 267 };
auto print = [](const int& n) { std::cout << " " << n; };
std::for_each(nums.begin(), nums.end(), print);
std::cout << '\n';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...