Язык программирования C++ от Страуструпа

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


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



Содержание раздела