std::set - подобная поддержка объекта функции в моем контейнере

Я реализовал свой собственный контейнер:

template<typename T>
class MyContainer
{
    // body where in some point 2 elements of collection are compared (-1, 0 and 1 possible comparison results)
};

То, что я хочу сделать, это добавить поддержку функциональных объектов, как в std:: set, где можно сделать функциональный объект следующим образом:

struct Comparator
{
    bool operator()(const char* s1, const char* s2) const
    {
        return strcmp(s1, s2) < 0;
    }
};

а затем передать его как заданный параметр:

std::set<const char*, Comparator> SomeSet;

Я не каждый день программист C++, поэтому мне нужна помощь для достижения этой цели. Что я должен сделать, чтобы добавить поддержку этому? Должен ли я создать поле в MyContainer для того, чтобы сохранить объект функции в нем, чтобы использовать его в моих методах сортировки внутри контейнера?

1 ответ

Решение

Я решил это, добавив значение шаблона по умолчанию и определив класс сравнения по умолчанию:

template<typename T, class Compare = DefaultTreeOrder<T>>
class MyContainer
{
    private:
        Compare compare;
    public:
        MyContainer()
        {
            compare = Compare();
        }
};

где DefaultTreeOrder является:

template<typename T>
class DefaultTreeOrder 
{
    public:
        int operator()(T value1, T value2)
        {
            less<T> l;
            greater<T> g;

            if(l(value1, value2))
            {
               return 1;
            }
            else if(g(value1, value2))
            {
                return -1;
            }

            return 0;
        } 
};
Другие вопросы по тегам