Пользовательский класс как параметр шаблона

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

2 ответа

Решение

Вы должны вынести сравнение как тип, как нормальный 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< перегружен уже.

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

Другие вопросы по тегам