Frage

Gibt es eine gute Methode für das Schreiben von C / C ++ Funktionsköpfe mit Standardparametern, die Funktionsaufrufe sind?

Ich habe einige Header mit der Funktion:

int foo(int x, int y = 0);

ich in einem großen Code-Basis arbeite, wo viele Funktionen diese Funktion aufrufen und sind abhängig von diesem Standardwert. Dieser Standardwert muss jetzt etwas ändern dynamisch und ich nach einem Weg suchen zu tun:

int foo(int x, int y = bar());

Wo bar () eine Funktion ist, die den Standardwert auf der Basis einiger Systemparameter generiert. Alternativ würde diese Funktion Prototyp wie folgt aussehen:

int foo(int x, int y = baz.bar());

Wo baz ist eine Funktion zu einem Objekt gehört, die nicht innerhalb der Header-Datei instanziiert hat.

War es hilfreich?

Lösung

Andere Tipps

würde ich zwei überladene Funktionen zur Verfügung:

int foo(int x, int y);

int foo(int x){return foo(x,bar);}

Wenn Sie die Weiterleitungsfunktion zu inlined erlauben, dann ist die Leistungseinbuße auf Null zu klein wahrscheinlich. Wenn Sie den Körper es aus der Reihe in einer nicht-Header-Datei halten kann eine Leistungskosten (wahrscheinlich gering sein), aber viel mehr Flexibilität bei der Implementierung und reduziert Kopplung.

Ja. Was haben Sie Werke geschrieben.

Was ist los mit einfach dem optionalen Parameter in der ersten Erklärung zu entfernen und eine einzelnen Parameter Überlastung bereitstellt?

int foo(int x)
{
    Bar bar = //whatever initialization
    return foo(x,bar.baz());
}

int foo(int x,int y)
{
  //whatever the implementation is right now
}

Ich denke, das viel saubere und flexibler sein neigt als zu versuchen, einigen dynamischen Standardwert verwendet werden.

Im Standard Abschnitt 8.3.6 (Standardargumente), Absatz 5, sie geben ein Beispiel mit nur diesen Ansatz. Insbesondere ruft sie heraus, dass Standardargumente sind Ausdrücke , so ein Funktionsaufruf gilt, wenn auch mit Einschränkungen wie Namen-Suche und geben Sie Kompatibilität.

In meinem Arbeitsplatz, haben wir Unterschriften wie folgt verwendet:

void An_object::An_object(
  const Foo &a,
  const Bar &b,
  const Strategem &s = Default_strategem()
);

ermöglichen Kunden ein Verhalten in einer Klasse Konstruktor außer Kraft zu setzen. Es kam praktisch für bedingtes Verhalten, die Leistung eines Übersetzers betroffen ...

Tangential, aber das scheint mir, wie es die Abhängigkeit Probleme auf der Straße einführen würde. Ich würde gehen mit stbuton.myopenid.com Ansatz.

Es sollte vollkommen gültig sein, eine globale Funktion aufrufen oder ein globales Objekt in diesem Zusammenhang verweisen, solange die Erklärung der Funktion / Objekt im Rahmen. Es kann oder auch nicht ratsam sein (in Bezug auf gutes Design), aber es sollte funktionieren.

Versuchen Sie bar zu machen () eine statische Memberfunktion. Dies wird einen Teil des Programms ermöglichen, die eine solche statische Klasse in ihrem Umfang hat, darauf zuzugreifen. Zum Beispiel:

class Foo { public:

static int bar (); };

Dann würden Sie erklären:

int foo (int x, int y = Foo :: bar ());

Wenn Sie verschiedene Objekte müssen dann stattdessen in der Instanz des Objekts übergeben.

scroll top