C ++ STL Класс сравнения: как параметризовать поведение комп-класса? - PullRequest
1 голос
/ 28 марта 2011

Я хочу использовать контейнер 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», даже если вопрос может быть полностью независимым от этого класса адаптера. Если кто-то хочет удалить его, просто сделайте это.

1 Ответ

2 голосов
/ 28 марта 2011

Вам не хватает определения конструктора Compare:

explicit Compare(const comp_type & comp) : comp(comp) { }

Кроме этого, он собирается и запускается для меня.

Также Compare представляетсяизлишний.Он просто упаковывает comp_type с идентичным интерфейсом.Код по-прежнему создается и запускается после удаления класса Compare и его замены везде на comp_type.

...