Я хочу использовать контейнер std :: priority_queue с пользовательским типом данных и несколькими критериями сравнения (я определил функтор для каждого из них; каждый из них работает с одними и теми же типами).
Сам используемый критерий сравнения должен быть конфигурируемым через параметр функции (избегая инициализации if_then_ очереди).
На основании этого поста , который, насколько я понимаю, использует функтор сравнения, который сам по себе инициализируется указателем функции на одну из определенных функций сравнения, я попытался использовать настраиваемый функтор сравнения, который инициализируется другим функтором сравнения (который затем сохраняется локально и используется при вызове). Я еще не заставил его работать.
Я даже не знаю, возможно ли вообще делать то, что я хочу. Я не знаю, сделал ли я что-то не так в отношении типов (я использовал typedef boost :: function xxx) или мне нужны дополнительные функции C ++ 0x («закрытие» поможет?).
Так что в основном я хочу, чтобы работало что-то вроде следующего (это не скомпилируется с недолгой, но ужасной ошибкой; GCC 4.5):
#include <iostream>
#include <queue>
#include <boost/tuple/tuple.hpp>
#include <boost/function.hpp>
typedef boost::tuple<double, int> custom_type; // example only!
typedef boost::function<bool (const custom_type & l, const custom_type & r)> comp_type; // comparison functor
struct fifo_comp
{
bool operator() (const custom_type & l, const custom_type & r) const
{
// compare only id
return l.get<1>() > r.get<1>();
}
};
struct lifo_comp
{
bool operator() (const custom_type & l, const custom_type & r)
{
// compare only id
return l.get<1>() < r.get<1>();
}
};
class Compare
{
public:
explicit Compare(const comp_type & comp);
bool operator() (const custom_type & l, const custom_type & r)
{
return comp(l, r);
}
private:
const comp_type & comp;
};
class Some_Class_Using_Queue
{
public:
Some_Class_Using_Queue(comp_type & comp) : pqueue(Compare(comp)) {}
void test()
{
pqueue.push(custom_type(1.0, 1));
}
private:
std::priority_queue<custom_type, std::vector<custom_type>, Compare> pqueue;
};
int main()
{
comp_type f = fifo_comp();
Some_Class_Using_Queue temp((f)); // critical
temp.test();
return 1;
}
- Любая помощь, чтобы заставить его работать на меня (использование STL / Boost приветствуется)?
- Есть идеи получше (разве это совсем другое)?
- Есть ли здесь какие-нибудь полезные функции C ++ 0x (возможно, замыкания)?
Спасибо.
PS / Edit: я знаю, что возможно и действительно легко сделать класс шаблонным и вызвать класс с соответствующим comp-классом как template-param. Но я не знаю, если это лучший способ сделать это (в отношении дизайна). При таком подходе мне пришлось бы переключать / if-else перед вызовом из-за необходимости наличия параметра шаблона во время компиляции.
PS: я установил тег «priority_queue», даже если вопрос может быть полностью независимым от этого класса адаптера. Если кто-то хочет удалить его, просто сделайте это.