2017-06-08 2 views
1

Unsere Gruppe ist vor kurzem zu C++ gewechselt. Mein Vorgesetzter ist so freundlich, eine Vorlage zur Verfügung zu stellen, die aus einer Menge von Klassen und relevanten Methoden besteht. Das Problem, das ich gefunden, dass die meisten Methoden eine Menge von Eingabeparametern erfordern, wie folgt aus:Kürzen C++ Funktion Eingangsparameter?

void AdvectionReactionDiffusion::boundary(const arma::Col<double>& n, const arma::Col<double>& u, const arma::Col<double>& uhat, const arma::Col<double>& fhat, arma::Col<double>& fb, arma::Mat<double>& fb_u, arma::Mat<double>& fb_uhat, arma::Mat<double>& fb_fhat) const {} 

Also, aus Gründen der besseren Lesbarkeit und weniger menschliche Fehler, ist es gute Möglichkeiten, um diese Eingaben zu verkürzen, ohne das zu Brechen aktuelle Struktur des Codes?

Ich komme aus einem Python-Hintergrund, und was ich in Python tun werde, ist wrap relevanten Eingaben in einem named Tupel und werfen Sie es auf die Funktion. Aber ich habe keine Ahnung, wie man den ähnlichen Trick in C++ anwendet.

+7

Sollten Sie Ihren * Supervisor * (Lehrer?) Diese Frage nicht stellen? –

+0

Möchten Sie optionale optionale Argumente angeben? Trennen Sie die Argumenttypen von der Funktionssignatur? Parametergruppen an eine andere Funktion weiterleiten? –

+0

Diese Funktion hat 4 _out_ Parameter, gibt aber nichts zurück! Es könnte Zeit sein, nur zu sehen, ob Sie die Funktion aufbrechen können. – Tas

Antwort

5

Wenn Sie die Dokumentation auf Col und Mat lesen, werden Sie

enter image description here

enter image description here

In Kombination mit using namespace arma; in Ihrer cpp Datei (nie im Header !!!) finden Sie kann tun

void AdvectionReactionDiffusion::boundary(const vec& n, 
              const vec& u, 
              const vec& uhat, 
              const vec& fhat, 
              vec& fb, 
              mat& fb_u, 
              mat& fb_uhat, 
              mat& fb_fhat) const {} 

Sie haben diese Frage markiert , so dass Sie anstelle von Ausgabeparametern auch eine std::tuple zurückgeben können.

std::tuple<vec,mat,mat,mat> 
AdvectionReactionDiffusion::boundary(const vec& n, 
            const vec& u, 
            const vec& uhat, 
            const vec& fhat) const {} 

die Sie dann auspacken std::tie

std::tie(fb, fb_u, fb_uhat, fb_fhat) = ARD.boundary(n,u,uhat,fhat); 

Sie können natürlich das gleiche tun mit den Eingangsparametern.

+0

[Schreiben Sie nicht mit Namespace] (https://stackoverflow.com/questions/1452721/why-isusing-namespace-std-sidered-bad-practice) auf jedem nicht-trivialen Projekt –

+0

@PasserBy ich oft tun das, aber nur im lokalen Umfang. Sonst wäre es sehr mühsam, mathematische Ausdrücke mit vielen »std :: sin« und »std :: exp« usw. zu schreiben. –

+0

Ich stimme zu, dass die Eingabe mühsam ist, aber ich persönlich sehe dies einfach als einen Fehler von C++. Ich würde sagen, der Scope-Resolution-Operator wäre so viel weniger schmerzhaft, wenn es nicht ** zwei ** verdammte Doppelpunkte wären, die ** eine Verschiebung erfordern ** –