2017-09-20 5 views
0

I haben eine Funktion, die bis zu 4 Argumente verwendet, alle von ihnen optional. Außerdem haben alle Argumente Standardwerte, und der Benutzer kann angeben, welche Kombination von Argumenten er möchte.C++: Kombination von Standardparametern

Also, wenn ich dies:

void func (const A &a = A(), const B &b = B(), const C &c = C(), const D &d = D()); 

Der Benutzer kann es als func(A(), B()) verwenden, aber nicht als func(B(), C()).

Gibt es eine Möglichkeit jedes Argument Kombination zu ermöglichen, ohne ein Bündel von Überlastungen erstellen zu müssen? (In diesem Fall wäre es 8 sein)

+1

benannte Parameter Idiom (auch bekannt als das Builder-Muster), structs (vor allem in C++ 20 mit designierten Initialisierer) [Boost-Parameter] (http://www.boost.org/doc/libs/1_65_1/libs/parameter /doc/html/index.html) (oder ähnliche Bibliotheken) – Justin

+0

Ich glaube nicht, dass es gerade da ist, 'va_arg' lässt ein ähnliches Feature zu, aber ich bin mir ziemlich sicher nicht dasselbe. http://www.cplusplus.com/reference/cstdarg/va_arg/ –

+2

Dies wird oft gefragt, aber ich habe es selten mit einem tatsächlichen realen Beispiel gefragt, wo es kein Designproblem gab. Vielleicht sind Sie anders - in diesem Fall post more Details Ihres Problems und Designs. –

Antwort

0

Ich habe so gesehen Probleme vor allem, wenn Sie mit einer großen und alten Code-Basis zu tun haben. Die beste Lösung wäre, die Dinge so umzugestalten, dass Sie nicht mit einem solchen Problem konfrontiert werden, aber ich verstehe, dass Sie manchmal unter Druck stehen und mit minimalen Änderungen auskommen müssen.

Für so etwas, würde ich empfehlen, eine Klasse zu erstellen, die die Parameter für diese Funktion kapseln würden. Und diese Klasse würde die Builder-Entwurfsmuster haben:

https://en.wikipedia.org/wiki/Builder_pattern

Damit Sie flexibel sein würde, in dem Parameter würden Sie passieren.

Im Beispiel du hast, könnten Sie so etwas wie diese:

class FuncParams 
{ 
    public: 
    A& getA(); 
    B& getB(); 
    C& getC(); 
    D& getD(); 

    class FuncParamsBuilder 
    { 
     FuncParamsBuilder& setA(A& a); 
     FuncParamsBuilder& setB(B& b); 
     FuncParamsBuilder& setC(C& c); 
     FuncParamsBuilder& setD(D& d); 
     FuncParams *build(); 
    } 

    static FuncParamsBuilder& builder(); 
} 

Dann würde Ihr Funktionsaufruf nur sein:

void func(FuncParams *params); 

Und man könnte es so nennen:

func(FuncParams::builder().setA(a).setC(c).build()); 

Beachten Sie, dass dies nicht ein perfekter Weg, um dies zu kodieren: Sie können den Code-Schnipsel anpassen sollten oben um besser zu passen, was du versuchst zu tun. Sie können auch denken, wenn Sie Zeiger, Referenzen oder, noch besser, intelligente Zeiger wie unique_ptr Objekte verwenden möchten. Ich hoffe das hilft!

+0

Kann nicht helfen zu beachten, dass 'func (a, B {}, c);' ist viel weniger tippen und kann die ursprüngliche Funktion verwenden . –

+0

Das ist absolut richtig. Ich dachte jedoch, dass der Sinn dieser Übung darin bestand, Werte nicht an die Parameter zu übergeben. Wenn wir Werte an die Parameter übergeben, brauchen wir nicht einmal Standardwerte: Wir können einfach ständig Werte übergeben. – Discoverer98

Verwandte Themen