Указатели на функции — различия между версиями
Строка 1: | Строка 1: | ||
== Указатели на функции в С == | == Указатели на функции в С == | ||
+ | Рассмотрим метод qsort, который имеет прототип: | ||
+ | <source lang="cpp"> | ||
+ | void qsort(void *base, size_t nmemb, size_t size, int (*compare)(const void *, const void *)); | ||
+ | </source> | ||
+ | где | ||
+ | <source lang="cpp"> | ||
+ | int (*compare)(const void *a, const void *b) | ||
+ | </source> | ||
+ | указатель на функцию, которая имеет 2 параметра, и должна возращать значение: | ||
+ | * > 0, если a > b | ||
+ | * = 0, если a == b | ||
+ | * < 0, если a < b | ||
+ | Рассмотрим пример: | ||
+ | <source lang="cpp"> | ||
+ | struct Person { | ||
+ | int m_age; | ||
+ | } | ||
+ | </source> | ||
+ | Person *m; | ||
+ | qsort(m, count, sizeof(Person), &(byage)); | ||
+ | |||
== Указатели на функции в С++ == | == Указатели на функции в С++ == | ||
Версия 00:35, 14 мая 2011
Указатели на функции в С
Рассмотрим метод qsort, который имеет прототип:
void qsort(void *base, size_t nmemb, size_t size, int (*compare)(const void *, const void *));
где
int (*compare)(const void *a, const void *b)
указатель на функцию, которая имеет 2 параметра, и должна возращать значение:
- > 0, если a > b
- = 0, если a == b
- < 0, если a < b
Рассмотрим пример:
struct Person {
int m_age;
}
Person *m; qsort(m, count, sizeof(Person), &(byage));
Указатели на функции в С++
Одно из отличие С и С++ - в С++ есть перегрузка. Тогда получается
F f = qsort; // будет вызываться, что подойдет лучше всего
Вопрос:
Как происходит работа с шаблонными функциями?
Ответ:
Рассмотрим пример 1:
template <class It, class F> void A(It p, It q, F f);
A(v.begin(), v.end(), (int(*)(int))sqrt); // необходимо приведение типов
пример 2:
template <class T> T sqrt(T *);
Нам необходимо проинстанциировать функцию, для этого существует несколько способов:
sqrt(0);
template sqrt<int>; // явно для T = int
В результате, метод A мы можем вызывать:
A(v.begin(), v.end(), sqrt<int>);
Вопрос: Как получить указатели на члены класса? Ответ: Рассмотрим пример:
struct Person {
int m_age;
int m_salary;
string m_name;
string name() {
return m_name;
}
}
Тогда
int Person::(*p) = &Person::m_age;
string (Person::*f)() const = &Person::name;
Далее имеем
Person pers;
(pers.*p) = 10;
(pers.*f)();
Вопрос:
Мы имеем указатель на мембер класса. Можем ли мы его передавать как параметр функции?
Ответ:
Да, можем. К примеру,
struct by_field {
by_field(int Person::*field)
}
Замечание: Указатели на мемберы не приводяться ник чему. Они могут проверяться на равенство 0.