Специализация функции члена класса шаблона?

Я прошел через тонны вопросов на эту тему, но так и не смог найти ответ, который мог бы использовать.

У меня есть шаблон класса, который объявлен следующим образом:

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;
}
Другие вопросы по тегам