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

ОГЛАВЛЕНИЕ


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 будет реализовываться подстановкой. В частности, это полезно, если в шаблонной функции используется несколько функций, а не одна операция сравнения, и особенно это полезно, когда эти функции зависят от хранящихся в том же объекте данных.