Специализация функции члена класса шаблона?
Я прошел через тонны вопросов на эту тему, но так и не смог найти ответ, который мог бы использовать.
У меня есть шаблон класса, который объявлен следующим образом:
template <typename Type, int inSize>
class sortedVector
{
public:
sortedVector();
int getSize();
int getAmountElements();
bool add(const Type &element);
private:
Type *vector;
int size;
int amountElements;
};
Предполагается, что класс представляет отсортированный вектор, который может хранить элементы любого типа. Это часть задания по курсу программирования. Пока что кажется, что основная функция, заданная в присваивании, передает в функцию как целые числа, так и объекты типа Polygon. Полигон - это класс, который я делал ранее.
Предполагается, что вектор сортируется либо по площади переданных объектов-полигонов, либо, конечно, по значению переданных целых.
Для этого, я думаю, мне понадобятся две разные реализации add(const Type &element). Тот, который заботится о том, чтобы поместить int в его правильное место в векторе, и тот, который заботится о том, чтобы получить площадь многоугольника и вставить его в правильное место в векторе.
Мы говорим AFAIK о специализации шаблонов.
Я пробовал несколько разных методов, но до сих пор только что встретил ошибки компилятора. Каков наилучший способ добиться этого?
1 ответ
В C++ контейнер, который поддерживает порядок, обычно имеет аргумент шаблона для функтора сравнения, который должен использоваться для определения порядка элементов. Посмотри на std::set
например:
template<typename Key, typename Compare = std::less<Key>, class Allocator = allocator<Key>>
class set;
Вероятно, вы можете пропустить распределитель для этого упражнения. По умолчанию Compare
Функтор будет использовать operator<
но если я хочу использовать что-то другое, я могу создать экземпляр set
как это:
typedef std::set<int, std::greater<int> > MySet;
Таким образом, вам не нужно использовать специализацию здесь. Как ты мог так или иначе? Вы не можете специализироваться для всех классов, с которыми может использоваться ваш отсортированный вектор, потому что вы никогда не будете знать, сколько их там.
Так что это будет оформлять декларацию для sortedVector
выглядеть так:
template<typename Elem,
typename Compare = std::less<Elem> >
class sortedVector {
public:
// take the functor as a constructor argument in case it cannot be
// default constructed
sortedVector(Compare c = Compare()) : cmp_(c) {}
// ...snip...
void push_back(const Elem& x) {
cont_.push_back(x);
std::sort(begin(cont_), end(cont_), cmp_);
}
private:
// trick just use a std::vector as storage and guarantee our sorted invariant
std::vector<Elem> cont_;
// we need to store the comparison functor in case it has state
Compare cmp_;
};
#include<iostream>
int main(){
long long num;
std::cin>>num;
std::cout<<num;
}