std :: priority_queue: заказной порядок без определения класса компаратора

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

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

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;

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

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

Какие-либо предложения?


person Christian    schedule 15.11.2010    source источник
comment
У вас нет закрывающего символа boost::bind здесь - перед ›параметрами шаблона очереди. Это опечатка в опубликованном коде или в том, что вы пытались скомпилировать?   -  person Steve Townsend    schedule 15.11.2010


Ответы (1)


Это могло сработать:

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

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

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

person Steve M    schedule 15.11.2010
comment
+1, это хорошее решение. Я просто отмечу, что, к сожалению, это не совсем то же самое, что статическая передача определенного параметра функции / функтора шаблона, потому что boost::function использует динамическое размещение для создания объектов переменных функций. Таким образом, вы не получите такой же встроенной эффективности, сгенерированной компилятором, которую вы получили бы с настраиваемым статическим параметром функции. - person Charles Salvia; 15.11.2010