2012-03-18 4 views
1

Я просмотрел множество вопросов по этому вопросу, но до сих пор не смог найти ответ, который мог бы использовать.Шаблон класса член функции специализация?

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

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 об специализации шаблонов.

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

+0

Если не ваш 'sortedVector' также не хранить сравнительный функтор? – pmr

+0

Вы имеете в виду a ==? Возможно, я совершенно новичок в этом, но если это необходимо, я добавлю его позже. Для чего мне это нужно? :) – JKase

ответ

2

В 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; 
} 
+0

К сожалению, это то, о чем я никогда не слышал, и я думаю, что в этом случае не следует использовать, учитывая природу и ограничения задания. Честно говоря, я могу ошибаться, думая об специализации. – JKase

+0

Назначение выглядит следующим образом: «В этом задании вы создадите класс шаблона SortedVector, который должен иметь возможность хранить экземпляры любого заданного класса или встроенных типов данных C++. Метод add() должен возвращать« false », если вектор заполнен. Тогда есть, конечно, список того, что должен иметь класс, и заданный «основной». – JKase

+0

Итак, это именно то, что вам нужно. Я добавил реализацию по умолчанию. Хотя я думаю, что вам нужно поддерживать вместо того, чтобы полагаться на 'std :: vector'. Вы также можете пропустить« Compare »по умолчанию и можете реализовать' sort' самостоятельно, если вы не хотите полагаться на какие-либо функции stdlib. – pmr