2010-05-20 4 views
2

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

Спасибо!

ответ

1

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

Большое спасибо за немедленный ответ, и да, это для учебных целей. Я новичок в шаблонах, поэтому мне хотелось немного разобрать мои руки: D – Izza

+0

Просто из любопытства, но почему мы не должны внедрять наши собственные карты? – Izza

+0

@isurulucky: Поскольку вы делаете это на практике, все в порядке. Но в целом вы не должны тратить время на то, что уже сделано. (Если вам нужна карта, включите '' и используйте' std :: map'.) Тем более, что вещи, которые уже были выполнены, были (и были) сильно оптимизированы и протестированы. – GManNickG

0

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

Смежные вопросы