2012-05-15 8 views
14

Ich habe durch this similar question gelesen und finde mich weniger als mit den Antworten zufrieden. Ich habe keine einfache Funktion namens "foo"; Ich habe eine viel komplexere Funktion, die sehr reale Gefahren hat, wenn Parameter nicht vernünftig geliefert werden. Es scheint mir vorzuziehen, dass die Funktion ihre eigenen Regeln durchsetzt und die Systemrobustheit gewährleistet, als sich semantischen Feinheiten zu beugen, die auf "eine Funktion, eine Sache" bestehen. Ich denke, die bevorzugten Antworten auf diese Frage spiegeln den zu weit gefassten Programmieridealismus wider, nicht die Realität bestimmter Situationen.Ist es möglich, einen leeren std :: vector als Standardparameter anzugeben?

Was ich konfrontiert ist:

void DoSomethingVeryComplex(const CRect bounds, CPoint startPoint = CPoint(-1,-1)); 

Nun geschieht dies die semantischen Regeln gerecht zu werden - es irgendeine Sache tut, nicht mehrere Dinge. Das eine, was es macht, ist komplex und vielschichtig, aber es ist immer noch eins.

Für diese komplexe Sache wird empfohlen, dass der Benutzer die Grenzen liefert und die Funktion ihren eigenen Startpunkt bestimmen lässt. Erfahrene Benutzer möchten vielleicht die beachtlichen Berechnungen durchführen, um einen bestimmten alternativen Ausgangspunkt zu bestimmen und das zu liefern ... aber die Benutzer sind vorsichtig.

Und jetzt bin ich zu sehen, dass es in seltenen Fällen sinnvoll ist, nicht einen, sondern mehrere Startpunkte zu liefern. Dies ändert nichts an dem semantischen Konzept des beteiligten Prozesses, da der Prozess sich von einem Punkt zu Nachbarn, zu Nachbarn von Nachbarn usw. ausbreitet. Von vielen Punkten ausgehend ist es eine natürliche Erweiterung.

Dementsprechend würde ich angeben bevorzugen:

void DoSomethingVeryComplex(const CRect bounds, 
          const std::vector<CPoint> startPoint /* = empty" */); 

so, dass, wenn der Vektor leer ist, wird die Funktion nach wie vor dem Startpunkt bestimmt, und ob es irgendwelche Punkte im Vektor ist, werden sie verwendet als Startpunkt (e).

Gibt es eine C++ - Syntax, die mir erlaubt, ein leeres Array als Standardparameter anzugeben?

Antwort

23

in C++ 11, es ist einfachste:

const std::vector<CPoint> startPoint = {} 

Vorher wird diese Arbeit:

const std::vector<CPoint> startPoint = std::vector<CPoint>() 

Beide berufen sich auf die Standard-Konstruktor, der einen leeren Vektor erzeugt. Beachten Sie, dass dieselbe Syntax auch zum Aufruf anderer Konstruktoren verwendet werden kann, solange Sie die entsprechenden Argumente eingeben.

const std::vector<CPoint> startPoint = {CPoint(1, 2), CPoint(4, 5), CPoint(3, 9)} 

Wenn Sie diese Art von Fähigkeit für Ihre eigenen Klassen wollen, here's a link on how it works:

//this one has 5 default-constructed CPoints 
const std::vector<CPoint> startPoint = std::vector<CPoint>(5) 

In C++ 11, können Sie auch einen Standardvektor ausfüllen.

+0

Beat mich dazu. +1 – Martol1ni

+0

Danke! Ich wusste, dass es einen Weg geben musste, es zu tun. Ich bin mir nicht sicher, ob ich das wirklich tun möchte - vielleicht ist es klarer, keinen Standardparameter zu haben ... aber es gibt eine Menge Altcodes, die geändert werden müssen, wenn ich den alten Standardparameter eliminiere. – omatai

+0

@omatai, in der Tat ist es nicht schön, alten Code durchzugehen, um es auf den Standard zu bringen. – chris

Verwandte Themen