Проверьте, существует ли элемент в классе шаблона - PullRequest
0 голосов
/ 07 апреля 2020

Я создал класс с именем Set, который наследуется от базового класса с именем ISet, и выглядит примерно так:

template <class T>
class Set : public ISet<T>
{
public:
    Set();
    ~Set();
    Set(const Set &origin);
    Set operator=(const Set &origin);

    bool insert(T element);
    bool remove(T element);
    int size()const;

private:
    T *arr;
    int cap, nrOfElement;

    void deepCopy(const Set &origin);
    void freeMemory();
};

Теперь я должен построить функцию с именем insert, которая должна вставлять элемент введите T тогда и только тогда, когда она еще не существует. У меня есть проблема, чтобы понять, как решить эту проблему, поскольку элемент T должен быть любого типа. Я пробовал что-то вроде:

bool Set<T>::insert(T element)
{
    bool added = false;

    if (nrOfElement == 0)
    {
        this->arr[0] = element;
        this->nrOfElement++;
    }
    else
    {
        for (int i = 0; i < this->nrOfElement; i++)
        {
            if (this->arr[i] == element)
            {
                i = this->nrOfElement;
                added = true;
            }
        }
        if (added == false)
        {
            this->arr[nrOfElement++] = element;
        }
    }

    return added;
}

Но так как некоторые из классов, которые я пытаюсь вставить как T, не имеют оператора ==, он не может обработать операцию == выше, я пытаюсь делать. Должен ли я попытаться type_cast это? Или как ты это решаешь?

1 Ответ

2 голосов
/ 07 апреля 2020

Либо

  1. Документируйте, что ваш шаблон работает только с типами, которые сопоставимы по равенству, или

  2. Сохраните объект функции в вашем классе шаблона, который может быть использован для сравнения объектов. Тип объекта сравнения должен быть аргументом шаблона. Вы можете по умолчанию std::equal_to<>, который будет использовать operator==, если не специализируется. Пользователь должен предоставить пользовательский объект сравнения, чтобы использовать шаблон с несравнимыми по равенству типами. Вот как стандартные контейнеры справляются со сравнениями. Если пользователь не может реализовать такой объект сравнения, то нет способа узнать, является ли один объект дубликатом другого.

...