std :: priority_queue: пользовательский порядок без определения класса компаратора - PullRequest
4 голосов
/ 15 ноября 2010

Я хочу иметь приоритетную очередь с пользовательским упорядочением, но, как я ленив, я не хочу определять оператор реализации класса компаратора ().

Мне бы очень хотелось, чтобы что-то подобное скомпилировалось:

std::priority_queue<int, std::vector<int>, 
    boost::bind(some_function, _1, _2, obj1, obj2)> queue;

где some_function - это функция, возвращающая bool, принимающая четыре аргумента, первый и второй - целые числа в очереди, а два последних - объекты, необходимые для расчета порядка (ссылки на константы).

(ошибка: «boost :: bind» не может появляться в константном выражении)

Но это не компилируется. Еще более простой

std::priority_queue<int, std::vector<int>, &compare> queue;

не будет компилироваться, поскольку сравнение - это двоичная функция, возвращающая bool.

(ошибка: несоответствие типа / значения в аргументе 3 в списке параметров шаблона для «шаблона класса std :: priority_queue»; ожидал тип, получил «сравнить»)

Есть предложения?

1 Ответ

11 голосов
/ 15 ноября 2010

Это может сработать:

std::priority_queue<int, std::vector<int>, 
    boost::function<bool(int,int)> >

Затем передайте выражение привязки конструктору очереди.

PS вы получаете эти ошибки компиляции, потому что вы помещаете выражения, оцененные во время выполнениягде ожидается имя типа или константа.

...