Пользовательский класс как параметр шаблона
Я повторяю 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<
перегружен уже.
Вы также можете использовать черты типа. Это даст вам основу для решения возможных будущих различий между типами.