2017-05-07 3 views
0

Kommend von MATLAB möchte ich wissen, ob es eine Möglichkeit gibt, Funktionsargumente in C++ zu verwenden, so wie es in MALTAB gemacht wird. Hier ist ein Beispiel zu veranschaulichen, was ich versuche, in C++ zu verwenden:C++ Funktionsargumente mit MATLAB-Syntax?

draw('shape','circle','radius',5); // should draw a circle 
draw('shape','square','width',3,'hight',4); // should draw a square 

Die Funktion oben ist die gleiche, aber die Funktion arguements unterscheiden. Ich würde gerne diese Syntax in C++ verwenden. Gibt es einen guten Weg, dies zu tun? Vielen Dank.

+1

Ist das wirklich was du willst? C++ bietet viel sauberere Lösungen, bei denen Sie nicht auf Strings wie Polymorphie angewiesen sind. Ein Vorteil ist, dass Sie im Falle eines Codierungsfehlers anstelle von Laufzeitfehlern Kompilierungsfehler erhalten. Und deine IDE wird dich dafür mögen. – Bernhard

Antwort

2

Sie könnten versuchen, die folgenden (wenn auch nicht wirklich klar ist, was Ihr Hauptziel ist):

void MyDrawingFunc(const std::vector<std::string>& Arguments) 
{ 
    auto& arg = Arguments[0]; 

    if (arg == "shape") 
     DoShapeStuff(Arguments); // use Arguments[1...] 
    else if (arg == "otherThing") 
      ... 
} 
2

Sie können C++ funktionieren genau wie MATLAB (siehe Antwort oben), aber es nicht machen viel Sinn. Ein sehr guter Indikator dafür ist, Ihr Testfall selbst:

draw('shape','square','width',3,'hight',4); // should draw a square 

Sie height falsch geschrieben. In meinem üblichen Code würden Sie (Laufzeit-) Warnung von "unbekanntem Spezifizierer hight" bekommen und 4 zugunsten des Standardwertes ignoriert haben oder vielleicht nichts tun. Und diese Warnung ist nur hier, weil ich es schreibe in otherwise Block. Eine Menge Code von Mitarbeitern tut dies nicht und würde einfach stillschweigend den Standardwert verwenden oder nichts tun.

Jetzt versuchen, das Debuggen in der Mitte einer komplizierten find some elements on image-Funktion - Sie würden nicht leicht herausfinden, es ist ein einfacher Tippfehler in Ihrem Anruf an draw Funktion.

Anstatt also Matlab-Code in C machen ++, sollten Sie so etwas wie schreiben:

void MyDrawingFunct(Shape shape){ 
...} 

void MyDrawingFunct(Curve curve){ 
...} 

Wo Sie Formen zeichnen würden Sie definiert haben (wie Quadrat, Kreis etc.), und eine andere Funktion für Kurven usw. oder, wenn Sie gegen sagen wir sicherstellen wollen das Hinzufügen Ellipse-Shape und haben es zur Laufzeit fehlschlagen, können Sie einige weitere Funktionen haben - ...(Square ...) usw.

Der Hauptvorteil ist, dass MyDrawingFunct mit nennen versuchen, sagen Ellipsoid wird sofort benachrichtigen Sie, of error (bei Kompilierung Zeit), während Sie Dinge tun, die Ihre gewohnte MATLAB-Methode haben, werden Sie sich fragen, ob ellipsoid nicht implementiert ist oder Sie nur irgendwo einen Tippfehler gemacht haben (wie in Ihrem Beispiel). Und Sie werden das zur Laufzeit treffen.

Verwandte Themen