Программирование >>  Операторы преобразования типа 

1 ... 94 95 96 [ 97 ] 98 99 100 ... 239


В следующем примере адаптер mem fun ref вызывает функцию prrnt() каждого элемента вектора:

fo/memfunla.cpp class Person {

private: std::str1ng name;

public;

void print 0 const (

std::cout name std::endl;

void prlntWithPrefix (std::str1ng prefix) const { std::cout prefix name std::endl:

void foo (const std::vector<Person>& coll)

using std using std using std

for each: bind2nd; mem fun ref:

Вызов функции printO для каждого элемента вектора for each (coll .beginO. coll.endO.

mem fun ref(&Person::print));

Вызов функции printWithPrefixO для каждого элемента - строка person; передается при вызове for each Ccoll .beginO, coll.endO.

bind2nd(mem fun ref(&Person;;printWithPref1x), person: ));

int mainO

std::vector<Person> col 1(5); foo(con);

std;;vector<Person*> col 12: con2,push back(new Person); ptrfoo(coll2);

В функции foo() для каждого элемента вектора coll вызываются две функции класса Person: *

О функция Person::print() вызывается без аргументов;

О функции printWrthPrefixO при вызове передается аргумент.



Чтобы вызвать функцию Person::print(), мы передаем объект функции mem fun ref(&.Person;:print) алгоритму for each():

for each (соП.Ьед1п(). coll.endO.

mefTi fLin refC&Person: ;print)):

Адаптер mem fun ref трансформирует обращение к элементу в вызов указанной функции класса.

Почему необходимо использовать адаптер? Потому что алгоритму нельзя напрямую передать функцию класса. Если попытаться это сделать, произойдет ощибка компиляции:

for each Ccoll,beginC). coll.endO.

SPerson::pr1nt): ОШИБКА: невозможно вызвать оператор С)

для указателя на функцию класса

Проблема заключается в том, что for each() вызывает оператор () для указателя, переданного в третьем аргументе, вместо функции класса, на которую он ссылается. Адаптер mem fun ref решает эту проблему, преобразуя вызов оператора ().

Как показывает второй вызов for each(), адаптер bind2nd также позволяет передать один аргумент вызванной функции класса:

for each (coll.beginO. coll.endC).

blnd2ndCmem fun ref(&Person::pr1ntW1thPref1x), person: )):

Наверное, вас удивляет, что адаптер называется mem fun ref, а не просто mem fun. Исторически сложилось так, что первой появилась другая версия функциональных адаптеров, которой и было присвоено название mem fun. Адаптеры mem fun предназначались для последовательностей, содержащих указатели на элементы. Возможно, во избежание путаницы их следовало бы на.звать mem fun ptr. Следовательно, функции классов могут вызываться не только для серий объектов, но и для серий указателей на объекты. Пример:

fo/fTiemfunlb.cpp

void ptrfoo (const std;:vector<Person*>& coll)

указатель!

using std: using std; using std:

for each b1nd2nd; mem fun;

Вызов функции printC) для каждого обьекта. на который ссылается указатель for each (coll.beginO. coll.endC).

mem funUPerson; ;pr1nt));

В прежних версиях STL н стандартной библиотеки С+-Ь адаптеры для функций с одним apiy.ueirroM назывались mem funl и niem funl ref вместо mem fun и mem fun ref.



Вызов функции printWithPreflx С) для каждого обьекта. на который ссылается указатель - строка person; передается при вызове for each (coll.beginC), coll.endO.

blnd2nd(mem fun(&Person;:printWithprefix). person: ));

Адаптеры mem fun ref и mem fun позволяют вызывать функции классов без аргументов или с одним аргументом. Вызвать функцию с двумя аргументами подобным образом не удастся. Дело в том, что для реализации этих адаптеров необходимы вспомогательные объекты функций, предоставляемые для каждого вида функций. Например, вспомогательные классы для mem fun и mem fun ref называются mem fun t, mem fun ref t, const mem fun t, const mem fun reM, mem funl t, mem funl refj, const mem funl t и const mem funl ref t.

Учтите, что функции классов, вызываемые mem fun ref и mem fun, должны быть константными. К сожалению, стандартная библиотека С-ь+ не предоставляет функциональных адаптеров для неконстантных функций классов (автор обнаружил это в ходе работы над книгой). Вероятно, это объясняется простым недосмотром (просто никто не знал, что это невозможно), и проблема может быть регпена без особых хлопот. Будем надеяться на ликвидацию этого недостатка в будущих реализациях (и версиях стандарта).

Функциональные адаптеры для обычных функций

Функциональный адаптер ptr fun позволяет использовать обычные функции с другими функциональными адаптерами (таб;1. 8.4).

Таблица 8.4. Функциональные адаптеры для обычных функций

Выражение

Описание

ptr fun(op)

*op(param)

*op(paraml,param2)

Предположим, имеется глобальная функция, которая проверяет некоторое условие для передаваемого параметра:

bool check(int elem):

Поиск первого элемента, для которого проверка завершается неудачей, производится следующей командой:

pos = find if Ccoll .beginO. coll.endO, Интервал

notl(ptr fLin(check))); Критерий поиска

Применить конструкцию notl(check) нельзя, поскольку notl() использует специальные типы, предоставляемые объектами функций (см. далее).



1 ... 94 95 96 [ 97 ] 98 99 100 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика