На этом шаге мы рассмотрим пример использования бинарного композиционного адаптера.
Один из бинарных композиционных адаптеров обрабатывает результат двух унарных операций, которым передаются разные элементы. Назовем этот адаптер compose_f_gx_hy. Возможная реализация выглядит так:
#include <functional> // Класс композиционнного адаптера compose_f_gx_hy template <class OP1, class OP2, class OP3> class compose_f_gx_hy_t : public std::binary_function<typename OP2::argument_type, typename OP3::argument_type, typename OP1::result_type> { private: OP1 op1; // Вычисление: op1(op2(x),op3(y)) OP2 op2; OP3 op3; public: // Конструктор compose_f_gx_hy_t (const OP1& o1, const OP2& o2, const OP3& o3) : op1(o1), op2(o2), op3(o3) { } // Вызов функции typename OP1::result_type operator()(const typename OP2::argument_type& x, const typename OP3::argument_type& y) const { return op1(op2(x),op3(y)); } }; // Вспомогательная функция для композиционного адаптера compose_f_gx_hy template <class OP1, class OP2, class OP3> inline compose_f_gx_hy_t<OP1,OP2,OP3> compose_f_gx_hy (const OP1& o1, const OP2& o2, const OP3& o3) { return compose_f_gx_hy_t<OP1,OP2,OP3>(o1,o2,o3); }
В следующем примере демонстрируется применение адаптера compose_f_gx_hy. В нем производится поиск подстроки без учета регистра символов (регистр не учитывается только для латинского алфавита):
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #include <iterator> #include <vector> #include <algorithm> #include <functional> #include "compose22.hpp" #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } int main() { // string s("Internationalization"); // string sub("Nation"); string s("Например"); string sub("пример"); // Поиск подстроки без учета регистра символов (для латинских букв) string::iterator pos; pos = search (s.begin(),s.end(), // Строка sub.begin(),sub.end(), // Искомая подстрока compose_f_gx_hy(equal_to<int>(), // Критерий сравнения ptr_fun(::toupper), ptr_fun(::toupper))); if (pos != s.end()) { cout << "\"" << ToRus(sub) << "\"" << ToRus(" часть ") << "\"" << ToRus(s) << "\"" << endl; } getch(); return 0; } //---------------------------------------------------------------------------
Программа выводит следующий результат:
Рис.1. Результат работы приложения
Со следующего шага мы начнем рассматривать алгоритмы STL.