2017-01-20 2 views
-1

Problem: Überladen Sie den Standardoperator << für eine vector<int> v Variable, so dass cout << v jedes Element sequenziell druckt. Hier habe ich eine Option sah wie von Jason Iverson in der previous question vorgeschlagenC++ Überladen des Operators mit/ohne Definieren einer Vorlage

template<typename T> 
std::ostream& operator<<(std::ostream& s, std::vector<T> t) { 
    s << "["; 
    for (std::size_t i = 0; i < t.size(); i++) { 
     s << t[i] << (i == t.size() - 1 ? "" : ","); 
    } 
    return s << "]" << std::endl; 
} 

Das sollte natürlich für jede Art von Elementen arbeiten, aber da ich nur besorgt bin mit int, vereinfachte ich die Funktion als

ostream& operator << (ostream &os, const vector<int> &v){ 
    for (auto x: v){ 
     os << " " << x; 
    } 
    return os; 
} 

Es funktioniert einfach gut.

Also meine Frage

ist
  1. Soweit vector<int> v betroffen ist, was ist der Nachteil von nicht template verwenden?
  2. Abgesehen von der allgemeinen Zweckbestimmung, was ist der Vorteil von Jasons Lösung?

Vielen Dank!


Deeper Gedanken: Die obige Frage war schlecht formuliert, und dank den Kommentaren, ich glaube, es ist sinnvoll, es neu zu formulieren macht. Frage: in C++, Was kostet die Verwendung von template wo eine Single-Type-Funktion ist genug?


Credits @Marco A und @Walter könnte diese Frage geschlossen werden.

+4

Wissen Sie, was eine 'Schablone' ist? Wenn ja, warum fragst du, wenn nicht, geh und lerne darüber. – Walter

+0

Welchen Vorteil hat dann der allgemeine Zweck/die Überlastungen nicht selbst schreiben zu müssen? – NathanOliver

+0

@Walter Ich kenne 'template', möchte aber seinen Vorteil verstehen, abgesehen davon, dass es allgemeiner ist, indem ich den Typ' T' nicht spezifiziere. – wenduowang

Antwort

0

Einer der wichtigsten Punkte von C++ ist generic programming und template s sind die Art und Weise, dies zu tun.

Der Vorteil liegt auf der Hand: Sie müssen das gleiche/ähnliche Stück Code nicht mehr als einmal schreiben, und Sie müssen nicht ähnliche Codeabschnitte debuggen/warten, sondern nur einen. (All dies fällt in Ihre Kategorie "allgemeiner Zweck", also gibt es keinen Vorteil darüber hinaus).

Es gibt tatsächlich einen Nachteil, weil template keine Funktion (oder Klasse) ist. Eine Funktion (oder Klasse) wird nur aus der template zur Kompilierzeit erstellt, wenn es tatsächlich verwendet wird, während Ihre (nicht Vorlage) -Funktion möglicherweise vorkompiliert wird. Dies hat zwei Implikationen: (1) mehr Kompilieren und (2) dass bestimmte Syntaxfehler im Code nur auftauchen, wenn die template mit Argumenten verwendet wird, für die sie nicht funktionieren. Die template in Ihrem Beitrag, zum Beispiel, wird nicht kompiliert, wenn nicht definiert wurde.

+0

Gibt es einen Nachteil, eine solche Vielseitigkeit zu haben, oder kommt es zu den gleichen Kosten wie die Definition einer eng begrenzten Funktion? – wenduowang

+0

@wenduowang sehe meine aktualisierte Antwort. – Walter

+0

Danke! Das ist klar. – wenduowang

Verwandte Themen