Я написал перегрузку оператора == для класса, обрабатывающего очередь. В этом классе я использую шаблон, и первый элемент управления, который я хочу добавить, - это управление типом шаблона.
Это код
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)
.... но это неправильно
Просто напишите перегрузку 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;
}
Вот пример на идеоне.
U
в первом.
Если вы используете 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;
}
disable_if
, только Boost имеет.
T
в аргументе функции совпадает с типом элемента дляQueue
, вы даже не сможете скомпилироватьqueue1 == queue2
.Queue<string>
сQueue<int>
amd, если да, то почему?