Критерий сравнения и классы

121
14 августа 2018, 16:40

Хочу написать шаблон класса AVL_tree но столкнулся с проблемой: а как передать критерий сравения? Всмысле как написать конструктор для класса, который бы принял функтор, вроде:

struct foo {
    bool operator()(int a, int b) {return a > b};
}
...
AVL_tree<int> a(foo);
...

или

AVL_tree<int, foo> a;
Answer 1

Пример передачи компаратора через шаблонный параметр:

#include <functional>
template <class T, 
          class Compare = std::less<T> >
class AVL_tree {
    ...
    // необходимый код для АВЛ дерева
    //-----
    // пример использования компаратора
    bool compare(T const & a, T const & b) const {
        return Compare{}(a, b);
    }
};
struct foo {
    bool operator()(int a, int b) {
        return a >= b;
    }
};
int main() {
    AVL_tree<int, foo> tree;
}
Answer 2

Использование указателя на функцию не подойдёт?

#include <iostream>
using namespace std;
class Foo{
private:
    bool (*cmp)(int a, int b); //компаратор
public:
    Foo(bool (*cmp)(int a, int b) = nullptr):cmp(cmp){//передача в конструкторе
    }
    void call(){ // вызов компаратора
        if(cmp != nullptr){
            cmp(1, 2);
        }
    } 
};
bool first (int a, int b){//первый компаратор
    cout << "\nFirst!";
    return true;
}
bool second (int a, int b){//второй компаратор
    cout << "\nSecond!";
    return false;
}
int main() {
    Foo f_foo(first), s_foo(second);
    f_foo.call();
    s_foo.call();
    return 0;
}
READ ALSO
Ошибка при вызове WSAPoll()

Ошибка при вызове WSAPoll()

Пишу простой UDP сервер под Windows, который принимает сообщения от клиентовПо заданию сокеты должны работать в неблокирующем режиме и обязательно...

154
Visual Studio Code Директива #include [закрыт]

Visual Studio Code Директива #include [закрыт]

Мне нужно сделать проект под линукс на плюсах, не когда ранее не программировал под негоСейчас вот поставил Visual Studio Code на Ubuntu установил все...

125
Как прокручивать окно при помощи WS_VSCROLL(C++ WINAPI)

Как прокручивать окно при помощи WS_VSCROLL(C++ WINAPI)

В своем оконном приложении на WINAPI решил использовать вертикальный скролл(Естественно, прописав в аргументах окна)Сам скролл появился, однако...

142
Firebase под Eclipse

Firebase под Eclipse

Как подружить Firebase FCM с Eclipse?

101