Пользовательский класс как параметр шаблона - PullRequest
2 голосов
/ 20 мая 2010

Я заново внедряю std::map. Мне нужно убедиться, что любой тип данных (базовый или определяемый пользователем) ключ будет работать с ним. Я объявил класс Map как шаблон, который имеет два параметра для ключа и значения. Мой вопрос: если мне нужно использовать строку в качестве типа ключа, как я могу перегрузить операторы <и> только для ключей строкового типа ?? В специализации шаблона мы должны специализировать весь класс с типом нам нужно, как я понимаю.
Есть ли способ сделать это лучше? Что если я добавлю отдельный класс Key и использую его в качестве типа шаблона для Key?

Ответы [ 2 ]

1 голос
/ 20 мая 2010

Вы должны вынести сравнение как тип, как это делает нормальный std::map. То есть есть служебный класс less_compare:

template <typename T>
struct less_compare
{
    bool operator()(const T& pLhs, const T& pRhs) const
    {
        return pLhs < pRhs;
    }
};

А потом:

template <typename Key, typename Value, typename Compare = less_compare<Key> >
class map
{
    // ...

private:
    Compare mCompare;
};

И для сравнения двух значений выполните: if (mCompare(someThing, someOtherThing)), что будет истинно, если someThing "меньше" someOtherThing. Обратите внимание, что этот факторинг также допускает пользовательские сравнения (именно поэтому в кавычках указано «меньше чем»). Это называется политическим дизайном.

И теперь вы можете специализировать только класс less_compare для C-строк. (А также предоставить greater_compare и род.)


Имейте в виду, что если это не для обучения, вы не должны реализовывать свою собственную карту. Также обратите внимание, что std::string уже перегружен operator<.

0 голосов
/ 20 мая 2010

Вы также можете использовать черты типа . Это даст вам основу для решения возможных будущих различий между типами.

...