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';