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


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.