Указатели на функции — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
(Новая страница: «Указатели на функции в С++ Одно из отличие С и С++ - в С++ есть перегрузка. Тогда получается F f =…»)
 
Строка 1: Строка 1:
Указатели на функции в С++
+
== Указатели на функции в С ==
 +
 
 +
 
 +
== Указатели на функции в С++ ==
 +
 
 
Одно из отличие С и С++ - в С++ есть перегрузка. Тогда получается
 
Одно из отличие С и С++ - в С++ есть перегрузка. Тогда получается
 +
<source lang="cpp">
 
F f = qsort; // будет вызываться, что подойдет лучше всего
 
F f = qsort; // будет вызываться, что подойдет лучше всего
 +
</source>
 
Вопрос:
 
Вопрос:
 +
 
Как происходит работа с шаблонными функциями?
 
Как происходит работа с шаблонными функциями?
 +
 
Ответ:
 
Ответ:
Рассмотрим пример:
 
  
 +
Рассмотрим пример 1:
 +
<source lang="cpp">
 +
template <class It, class F> void A(It p, It q, F f);
 +
A(v.begin(), v.end(), (int(*)(int))sqrt); // необходимо приведение типов
 +
</source>
 +
 +
пример 2:
 +
<source lang="cpp">
 +
template <class T> T sqrt(T *);
 +
</source>
 +
Нам необходимо проинстанциировать функцию, для этого существует несколько способов:
 +
*<source lang="cpp">
 +
sqrt(0);
 +
</source>
 +
*<source lang="cpp">
 +
template sqrt<int>; // явно для T = int
 +
</source>
 +
В результате, метод A мы можем вызывать:
 +
<source lang="cpp">
 +
A(v.begin(), v.end(), sqrt<int>);
 +
</source>
  
 
Вопрос:
 
Вопрос:
Строка 12: Строка 40:
 
Ответ:
 
Ответ:
 
Рассмотрим пример:
 
Рассмотрим пример:
 +
<source lang="cpp">
 
struct Person {
 
struct Person {
 
int m_age;
 
int m_age;
Строка 20: Строка 49:
 
}
 
}
 
}
 
}
 +
</source>
 +
 
Тогда  
 
Тогда  
 +
<source lang="cpp">
 
int Person::(*p) = &Person::m_age;
 
int Person::(*p) = &Person::m_age;
 
string (Person::*f)() const = &Person::name;   
 
string (Person::*f)() const = &Person::name;   
 +
</source>
  
 
Далее имеем
 
Далее имеем
 +
<source lang="cpp">
 
Person pers;
 
Person pers;
 
(pers.*p) = 10;
 
(pers.*p) = 10;
 
(pers.*f)();
 
(pers.*f)();
 +
</source>
  
 
Вопрос:
 
Вопрос:
 +
 
Мы имеем указатель на мембер класса. Можем ли мы его передавать как параметр функции?
 
Мы имеем указатель на мембер класса. Можем ли мы его передавать как параметр функции?
 +
 
Ответ:
 
Ответ:
 +
 
Да, можем. К примеру,
 
Да, можем. К примеру,
  
 +
<source lang="cpp">
 
struct by_field {
 
struct by_field {
 
by_field(int Person::*field)
 
by_field(int Person::*field)
 
}
 
}
 +
</source>
  
 
Замечание:
 
Замечание:
 
Указатели на мемберы не приводяться ник чему. Они могут проверяться на равенство 0.
 
Указатели на мемберы не приводяться ник чему. Они могут проверяться на равенство 0.

Версия 00:25, 14 мая 2011

Указатели на функции в С

Указатели на функции в С++

Одно из отличие С и С++ - в С++ есть перегрузка. Тогда получается

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.