Если вам нужно , чтобы операторы сравнения работали в шаблоне для строк в стиле C (массивы с нулевым символом в конце char
), вам потребуется специальный шаблон вместе с вашим общим шаблоном. Суть в том, что строки в стиле C нельзя сравнивать с помощью операторов.
template <class t>
int compare(const char * a, const char * b)
{
return strcmp(a, b);
}
template <class t>
int compare(const t& a, const t& b)
{
return (a == b) ? 0 : ((a < b) ? -1 : 1);
}
Примечание: эта шаблонная функция не будет работать для всех классов, которые не имеют operator<
или operator==
определено. , что приведет к хаосу в будущем.Это очень похоже на использование шаблонов C ++ для навязывания вещей в методологию языка C.
Лучший подход
Я вижу две специфические функции C ++, которые могут упростить вашу жизнь: перегрузка операторов и использованиеstd::string
.Использование этих функций избавит вас от необходимости использовать шаблонные функции.
Операторы перегрузки
Одна из причин использования шаблонной функции сравнение состоит в том, что в классе нет операторов сравненияdevined ( в противном случае вы бы использовали операторы ).Итак, определите перегруженные операторы <
и ==
.Другие операторы >, >=, <=
и !=
могут быть определены в терминах последних двух.См. boost
header заголовка оператора.
Использование std::string
Проблема использования операторов сравнения в строках в стиле C может быть устранена путем замены их на std::string
.Приятной особенностью std::string
является то, что в нем уже определены операторы сравнения.Таким образом, вы можете использовать <
для сравнения двух std::string
объектов.
Сводка
Вместо создания шаблонной функции, которая использует сравнение в стиле C (например, return -1, 0 или +1), определите операторы сравнения для ваших классов и преобразуйте массивы символов с нулевым символом в конце в экземпляры std::string
.