2016-06-12 20 views
0

Ich lerne Vorlagen und kam Funktionsvorlagen. Ich habe den folgenden Code aus meiner Kreativität oder nur Neugier entwickelt.Funktionsvorlage mit Operator überladen

#include<iostream> 
using namespace std; 
template <typename type> 
type Max(type a, type b) 
{ 
    return a > b ? a : b; 
} 
class Foo 
{ 
public: 
    string s1; 
    /* 
    Foo& operator>(Foo &obj) 
    { 
     if (this->s1.length() > obj.s1.length() ? true : false) 
      return *this; 
     return obj; 
    }*/ 
}; 
int main() 
{ 
    cout << Max(2, 3) << endl; 
    cout << Max(2.0, 3.0) << endl; 
    Foo a, b; 
    a.s1 = "AB"; 
    b.s1 = "ABC"; 
    //cout<<Max(a, b).s1; 
} 

Meine Idee ist Foo ein Objekt und b die Vorlage Max-Funktion zu übergeben und überlastet den ‚>‘ Operator und das String-Objekt druckt mit größerer Länge. Bin ich auf dem richtigen Weg oder sollte es mit Klassenvorlagen zusammenhängen?

+1

'Operator>' kehrt normalerweise 'bool'. – aschepler

Antwort

0
#include <iostream> 

using namespace std; 

template <typename type> 
type Max(type a, type b) 
{ 
    return a > b ? a : b; 
} 

class Foo { 
public: 
    string s1; 
    bool operator > (Foo &obj) { 
     return this->s1.length() > obj.s1.length();   
    } 
}; 

int main() 
{ 
    cout << Max(2, 3) << endl; 
    cout << Max(2.0, 3.0) << endl; 
    Foo a, b; 
    a.s1 = "AB"; 
    b.s1 = "ABC"; 
    cout << Max(a, b).s1; 
} 

Dies vielleicht, was Sie wollen: output results

+0

: Wie funktioniert die Funktionsvorlage mit Objekten direkt ohne Änderungen wie Typ & Max (const Typ & a, const Typ & b) .Warum müssen wir das nicht ändern? Was ist das interne Funktionieren hier? Bitte erläutern Sie – Omkar

+1

Weil wir Überladen Sie das>, damit Max() das größere Objekt zurückgibt. Wir brauchen hier keine Referenz zu verwenden. –

+2

@OMKAR Ohne '' & '' zu verwenden, kopiert 'Max()' die 'type' Objekte, bevor der Vergleich durchgeführt wird, und kopiert dann auch das Ergebnis. Es funktioniert, aber die Verwendung von Referenzen wäre effizienter –

2

Lassen Sie operator> zurückgeben bool, sonst kann es nicht mit return a > b ? a : b; arbeiten.

bool operator>(const Foo &obj) 
{ 
    return this->s1.length() > obj.s1.length(); 
} 

BTW1: if (this->s1.length() > obj.s1.length() ? true : false) ist überflüssig.
BTW2: Es ist besser, den Parametertyp auf const zu setzen, da obj nicht geändert werden muss und muss.

2

Sie sind auf dem richtigen Weg, mit der Ausnahme, dass der > Bediener einen const Referenzparameter nehmen soll, selbst eine const Klassenmethode sein, und gibt ein bool:

bool operator>(const Foo &obj) const; 

Nach allem, was erwarten Sie, das Ergebnis > zu sein, mit irgendetwas anderem, zum Beispiel:

double a, b; 

// ... 

auto whatisthis= a > b; 

erwarten Sie, whatisthis ein double zu sein? Natürlich nicht, es wird eine bool sein. Das Ergebnis eines Vergleichsoperators, nicht nur >, sollte ein bool sein. Es muss nicht wirklich sein, Sie können den Operator > überladen und alles zurückgeben; aber das bedeutet, dass Sie nicht so arbeiten können, wie Sie es erwarten.

2

Die Antwort auf Ihre Frage ist "Ja, Sie sind auf dem richtigen Weg."

Das Problem mit generischen Funktionen besteht darin, sie effizient zu verwenden. Ihre Max() Funktion funktioniert, aber es kopiert Objekte überall.

template <typename type> 
const type &Max(const type &a, const type &b) 
{ 
    return a > b ? a : b; 
} 

Dies löst das Kopieren Problem Object - aber jetzt ist es weniger effizient für Dinge wie int s.