Бьерн Страуструп - Язык программирования С++. Главы 5-8
Страница 80. Передача операций как параметров функций



8.4.3 Передача операций как параметров функций

 Можно не задавать функцию сравнения как часть типа
 Vector, а передавать ее как второй параметр функции sort().
 Этот параметр является объектом класса, в котором определена
 реализация операции сравнения:

         template<class T> void sort(Vector<T>& v, Comparator<T>& cmp)
         {
           unsigned n = v.size();

           for (int i = 0; i<n-1; i++)
               for ( int j = n-1; i<j; j--)
                   if (cmp.lessthan(v[j],v[j-1])) {
                   // меняем местами v[j] и v[j-1]
                      T temp = v[j];
                      v[j] = v[j-1];
                      v[j-1] = temp;
                   }
         }

 Этот вариант можно рассматривать как обобщение традиционного приема,
 когда операция сравнения передается как указатель на функцию.
 Воспользоваться этим можно так:

         void f(Vector<int>& vi,
                Vector<String>& vc,
                Vector<int>& vi2,
                Vector<char*>& vs)
         {
           Comparator<int> ci;
           Comparator<char*> cs;
           Comparator<String> cc;

           sort(vi,ci);   // sort(Vector<int>&);
           sort(vc,cc);   // sort(Vector<String>&);
           sort(vi2,ci);  // sort(Vector<int>&);
           sort(vs,cs);   // sort(Vector<char*>&);
         }

 Отметим, что включение в шаблон класса Comparator как параметра
 гарантирует, что функция lessthan будет реализовываться подстановкой.
 В частности, это полезно, если в шаблонной функции используется
 несколько функций, а не одна операция сравнения, и особенно это
 полезно, когда эти функции зависят от хранящихся в том же объекте
 данных.

 
« Предыдущая статья   Следующая статья »