|
Программирование >> Операторы преобразования типа
Таблица 8.5. Возможные имена композиционных адаптеров
Унарные композиционные адаптеры Унарные композиционные адаптеры являются весьма важными. Они также входят в реализацию STL от SGI. Вложенные вычисления с использованием адаптера compose f gx в простейшем композиционном адаптере результаты выполнения одной унарной операции становятся входными данными для другой унарной операции. Иначе говоря, этот адаптер просто обеспечивает вложенный вызов двух унарных объектов функщтй. Он понадобится для формулировки условий тигш прибавить 10 и умножить на 4 . Возможная реализация адаптера compose f gx (в реализации SGI используется имя composel) выглядит так: fo/composell.hpp #inc1ude <funct1onal> /* Класс композиционного адаптера cofTipose f gx */ template <class OPl. class 0P2> class compose f gx t : public std::unary function<typename 0P2:;argument type, typename OPl::result type> private: OPl opl: Вычисление: opl(op2Cx)) 0P2 op2; public: Конструктор compose f gx t(const 0P1& ol. const 0P2& o2) : oplCol). op2(o2) ( Вызов функции typename OPl::result type operatorOCconst typename 0P2: :argument type& x) const { return opUop2(x)): /* Вспомогательные функции для адаптера compose f gx */ template <class OPl. class 0P2> inline compose f gx t<0P1.0P2> compose f gx (const 0P1& ol. const 0P2& o2) { return cofTipose f gx t<OP1.0P2>(ol.o2): Пример использования адаптера compose f gx: fo/composel.cpp #include <iostream> #1nclude <vector> #include <algor1thm> #include <funct1onal> #1nclude <iterator> #include print.hpp #1nclude composell.hpp using namespace std; int rnain() { vector<int> coll; Вставка элементов со значениями от 1 до 9 for (int 1=1; 1<=9; ++1) ( coll.push back(i): PRINTJLEMENTSCcoll); Для каждого злемента прибавить 10 и умножить на 5 transform (coll.beginC),со11.end(). ostream iterator<int>Ccout. ). compose f gx(bind2ndCmultipl ies<int>(),5). bind2nd(plus<int>().10))); cout endl; Обратите внимание: сначала выполняется вторая операция, переданная compose f gx. Таким образом, следующая конструкция создает унарный объект функции, который сначала прибавляет 10, а потом умножает результат на 5: compose f gx(b1nd2nd(fTiultiplies<int>C) .5). bind2nd(plus<int>().10))); Результат вьшолнения программы: 1 2 3 4 5 6 7 8 9 55 60 65 70 75 ВО 85 90 95 Объединение двух критериев с использованием адаптера compose f gx hx Вероятно, из вспомогательных функциональных адаптеров самым важным является тот, который формирует единый критерий логическим объединением двух критериев. Он используется для формулировки условий типа больше 4 и меньше 7 . Возможная реализация адаптера compose f gx hx (в реализации SGI используется имя compose2) выглядит так; fo/compose21.hpp #inc1ude <funct1ona1> /* Класс композитного адаптера compose f gx hx */ template <class OPl. class 0P2. class 0P3> class compose f gx hx t : public std::unary function<typename 0P2::argument type. typename OPl::result type> private: OPl opl; Вычисление: oplCop2Cx).орЗСх)) 0P2 op2; 0P3 op3; public: Конструктор compose f gx hx t (const 0P1& ol. const 0P2& o2. const 0P3& o3) ; opUol). op2(o2). орЗСоЗ) ( Вызов функции typename OPl::result type OperatorOCconst typename 0P2: :argument type& x) const { return opl(op2Cx),op3Cx)); /* Вспомогательные функции для адаптера compose f gx hx */ template <class OPl. class 0P2. class 0P3> inline compose f gx hx t<0P1.0P2.0P3> compose f gx hx Cconst 0P1& ol. const 0P2& o2. const 0P3& o3) ( return compose f gx hx t<OPl.0P2.0P3>Col.o2.o3); Адаптер compose f gx hx использует первую операцию для объединения результатов двух унарных операций с одним объектом. Следующее выражение создает унарный предикат: compose f gx hx(opl.ор2.орЗ)
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |