Arhn - архитектура программирования

Сравнение типов шаблонов в операторе == перегрузка

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

это код

bool operator==(const Queue<T>& queue)
    {
        NodoCS<T>* NodoA = First;
        NodoCS<T>* NodoB = coda.First;

        if (this->DimQueue() != coda.DimQueue())
            return false;
        else
        {
            for (int i = 0; i < DimQueue(); i++)
            {
                if (NodoA->Element() != NodoB->Element())
                    return false;

                NodoA = NodoA->NextAddress();
                NodoB = NodoB->NextAddress();
            }

            return true;
        }
    }

Пример: у меня есть эти очереди:

Queue<int> queue1 и Queue<string> queue2

Очевидно, что они не равны, так как я могу контролировать, что int отличается от строки?

Я попытался написать параметр функции таким образом:

const Queue<T1>& queue

а потом if(T != T1)....но это неправильно


  • Что ж, если тип шаблона T в аргументе функции совпадает с типом элемента для Queue, вы даже не сможете скомпилировать queue1 == queue2. 21.12.2013
  • Вы хотите иметь возможность сравнивать Queue<string> с Queue<int> и если да, то почему? 21.12.2013

Ответы:


1

Просто напишите перегрузку operator==, которая сравнивает очереди одного типа и другие для очередей разных типов. Последний всегда возвращает false:

template<typename T>
bool operator==( const foo<T>& lhs , const foo<T>& rhs )
{
    return /* queues comparison */;
}

template<typename T , typename U>
bool operator==( const foo<T>& lhs , const foo<U>& rhs )
{
    return false;
}

Вот пример работы в ideone.

21.12.2013
  • Покончить с SFINAE и U в первом. 21.12.2013
  • @Yakk, это правда, я слишком усложнил эту вещь ... Спасибо :) 21.12.2013
  • Когда у вас есть проблема, и вы думаете: «Я мог бы решить ее с помощью SFINAE», теперь у вас есть две проблемы. 21.12.2013
  • Он собирается сравнить частный член, вам нужно добавить эту функцию, не являющуюся членом, в качестве друга в классе шаблонов Queue? 21.12.2013
  • @kwanti это правда, лично я всегда определяю бинарных операторов как друзей внутри класса; но это не относится к вопросу. Я написал ответ таким образом, потому что код более понятен. 21.12.2013

  • 2

    Если вы используете boost или С++ 11,

    template<typename U>
    typename std::enable_if<std::is_same<T, U>, bool>::type
    operator == (const Queue<U>& other)
    {
        ... do member comparison here
    }
    
    template<typename U>
    typename std::disable_if<std::is_same<T, U>, bool>::type
    operator == (const Queue<U>& other)
    {
        return false;
    }
    
    21.12.2013
  • Хорошо, у меня есть эти ошибки, и я не знаю, как с ними справиться: «Queue‹std::string›::First»: невозможно получить доступ к частному члену, объявленному в классе «Queue‹std::string›» (строка второго типа)... '!=' бинарный: не найден ни один оператор, принимающий левый операнд типа int. 21.12.2013
  • В С++ 11 нет disable_if, есть только в Boost. 21.12.2013
  • @ Manu343726 ты прав. Я понял это только сейчас. :) 21.12.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..