Листинг 12.11. Функтор с несколькими параметрами
class Greater { int value; public:
Greater(const int &v): value(v) {} bool operator()(const int& d) { return (d > value); }
};
Вызов выполняется так: copy_if(a, a+10, b, Greater(3));
Здесь мы имеем существенный выигрыш в универсальности (и в читабельности) по сравнению с функциями — вспомните функцию gt5 (). Ранее мы были вынуждены упрятывать все необходимые величины в функции-предикате, которая выполняла единственную операцию. Поэтому, чтобы сравнивать элементы контейнера с числом 5, нам нужно было писать функцию gt5 (), а чтобы сравнить с тройкой, приходилось писать другую функцию, например, gt3().
Естественно, можно объявить объект-функцию явным образом:
Greater four(4); copy_if(a, a+10, b, four);
Класс-функтор вполне может быть и шаблоном, например:
template <class T> class Greater { T value; public:
Greater(const T &v): value(v) {} bool operator()(const T& d) { return (d > value); }
};
Класс T должен иметь конструктор без аргументов и обеспечивать реализацию операции operator >.
Тогда вызов copy_i f () может выглядеть, например, так: copy_if(a, a+10, b, Greater<int>(4));
ВНИМАНИЕ
Следите за тем, чтобы имена ваших функторов-шаблонов не совпадали с именами функторов из стандартной библиотеки шаблонов. В противном случае можно «нарваться» на странные ошибки вплоть до fatal error (фатальная ошибка) компилятора. |