Как переписать оператор внутри шаблона - PullRequest
0 голосов
/ 19 сентября 2010

Привет, я создаю шаблон на С ++, и мне нужно переписать оператор "<" внутри шаблона, чтобы можно было сравнивать элементы внутри моей структуры данных. Может кто-нибудь, пожалуйста, скажите мне, как перезаписать его ... я должен отправить указатель на функцию внутри конструктора шаблона? У меня есть два шаблона, первый шаблон Node, который включает указатель на данные, которыми я управляю. и второй шаблон Heap, который имеет вектор узлов *. в моей реализации я должен быть в состоянии сравнить между узлами *. </p>

Ответы [ 3 ]

1 голос
/ 19 сентября 2010

Будет ли это делать?Я специально указал «оператор <» в области имен, чтобы он был более общим, хотя в комментариях показано, как это сделать. </p>

template<class T> struct A;

template<class T, class U>     // Remove U and modify accordingly, if f and s
                               // have to be of the same type.
bool operator < (A<T> const &f, A<U> const &s){
   // have the logic here
   return true;
}

template<class T> struct A{
   // template<class U>                // This is how you define inside a class.
   // bool operator < (A<U> const &s){
   //    have logic here
   //    return true;
   // }
};

int main(){
   A<int> a;
   A<double> d;

   bool b = a < d;
}
0 голосов
/ 19 сентября 2010

Перегрузка операторов в C ++ на самом деле довольно проста.Вероятно, что вы хотите сделать в своем классе узлов:

template<typename MyData>
class Node {
private:
    MyData data_;
    // ...

public:
    // ...
    bool operator < (Node const &rhs) const;
};

// ...

template<typename MyData>
bool Node<MyData>::operator < (Node const &rhs) const {
    return data_ < rhs.data_;
}

Это перегрузит оператор < в классе Node с версией, которая просто вызывает базовый оператор data_ value * <,

Вы можете поместить любой код внутри функции, кроме ее имени и количества параметров, у которых нет специальных свойств.Вы даже можете использовать это для сравнения разных типов или возврата разных значений.Например, вы можете изменить rhs в этом примере на int, тогда вы можете сравнить узлы с целыми числами (например, Node n; if (n < 10) ...).

0 голосов
/ 19 сентября 2010

Если шаблон предназначен для типа элемента, просто предположите, что у него есть компаратор, то есть * узел <* узел. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...