Warum sind Standardargumente in C++ nachhängende?warum Standardargumente sind schleppende Argumente?
Antwort
Wenn Sie void func(int a = 0, int b);
hatten, wie würden Sie angeben, den Standardparameter beim Aufrufen dieser Funktion zu verwenden?
Ich weiß, dass Sie in C++ nicht können, aber andere Sprachen behandeln das mit 'func (, some_val_for_b)' oder benannten Parametern. –
@Dominic Rodger: für mich sieht das wirklich hässlich aus. – dierre
@Dominic Rodger, gut, C++ nicht. Wenn du willst, kannst du Stroupstroup verklagen: P –
Da in einem Funktionsaufruf in jedem Fall die Nicht-Standardargumente aufgerufen werden müssen. Wenn Sie Ihr Standardargument an den Anfang der Argumentliste setzen, wie sollen Sie sagen, dass Sie das Standardargument oder die anderen Argumente setzen?
Was macht den Anfang einer Liste so fundamental anders als das Ende der Liste? Listen sind symmetrisch! –
Ja, aber stell dir folgendes vor: void func (int a, int b = 0, int c, int d = 0); Was machst du, wenn du func anrufst (1, 2, 3); –
Und welches Ende der Liste ist genau "b"? –
Nur um @ tenfours Antwort zu ergänzen. C++ - FAQ Lite hat ein Thema, das named parameters beschreibt und ich denke, dass das Thema Ihr Problem zu einem gewissen Grad anspricht.
Weil so die Sprache entworfen wurde.
Eine interessantere Frage wäre: Was sind die Alternativen?
Angenommen, Sie void f(A a = MyA, B b);
- Platzhalter/leeres Argument haben:
f(_, abee)
oderf(, abee)
- benannten Argumente (wie in Python):
f(b = abee)
Aber das sind Spitzfindigkeiten und schon gar nicht notwendig, denn Im Gegensatz zu Python unterstützt C++ das Überladen von Funktionen:
void f(A a, B b);
void f(B b) { f(MyA, b); }
und damit die Standardargumente sind nicht erforderlich ... besonders wenn man bedenkt, dass es Probleme gibt, wenn sie mit OO-Code verwendet, da Standardargumente statisch aufgelöst (kompilieren Zeit)
struct Base
{
virtual void func(int g = 3);
};
struct Derived
{
virtual void func(int g = 4);
};
int main(int argc, char* argv[])
{
Derived d;
d.func(); // Derived::func invoked with g == 4
Base& b = d;
b.func(); // Derived::func invoked with g == 3 (AH !!)
}
EDIT: auf benannte Parameter ->
Die Feature kann mit Funktionsobjekten emuliert werden.
class Func
{
public:
Func(B b): mA(MyA), mB(b) {}
A& a(A a) { mA = a; }
B& b(B b) { mB = b; }
void operator()() { func(mA, mB); }
private:
A mA;
B mB;
};
int main(int argc, char* argv[])
{
A a; B b;
Func(b)();
Func(b).a(a)();
}
Falls Sie nicht wollen, um die Argumente zu kopieren, haben Sie die Möglichkeit, Referenzen/Zeiger zu verwenden, obwohl es kompliziert werden kann.
Es ist ein handliches Idiom, wenn Sie eine Vielzahl von Standardeinstellungen ohne echte Reihenfolge der Priorität haben.
Das Überladen der Funktion hilft nicht, wenn 'A' und' B' beide vom selben Typ sind ... –
@Oli: Warum? Wenn man den ersten "func" -Prototyp angibt, ist klar, dass wenn nur ein Parameter vorhanden ist, der Standardwert für den ersten Parameter unabhängig von seinem Typ verwendet werden soll. Dinge werden haarig, wenn Sie zwei Standard haben;) Im Allgemeinen sind benannte Parameter das einzige Ding, das das Problem lösen konnte, und was groß ist, ist, dass sie eine Kompilierungszeitlösung sind. –
Ja, Sie haben Recht. Ich dachte, du benutzt das Überladen, um 'func (A a, B b)', 'func (B b)' * und * 'func (A a)' zu disambiguieren. –
- 1. Standardargumente in JAR-Manifest
- 2. Standardargumente als nicht statische Membervariablen
- 3. Standardargumente in gtk3 entfernt?
- 4. Verwenden ich Standardargumente falsch?
- 5. Fortran 2003/2008: Elegante Standardargumente?
- 6. Passing Argumente sind leer
- 7. Python Klassenkonstruktors mit Standardargumente
- 8. Standardargumente für Strukturen
- 9. Funktion Standardargumente und benannte Werte
- 10. Warum sind die ersten beiden Argumente von cgi.FieldStorage Keine?
- 11. Warum sind `take` und` drop` für negative Argumente definiert?
- 12. Was sind die Regeln für benannte Argumente und warum?
- 13. Wie definiert man JVM-Standardargumente in IDEA?
- 14. Vorlage Klasse Konstruktor Standardargumente
- 15. R Gittersatz Standardargumente
- 16. Dynamische Standardargumente in Python - Funktionen
- 17. Mehrere Parameter Listen und Standardargumente
- 18. Python Multiprocessing - Warum ist functools.partial langsamer als Standardargumente?
- 19. Warum kann ich keine Vorlagen- und Standardargumente haben?
- 20. Was sind die Argumente für main()?
- 21. Warum sind Merkmale instanziierbar?
- 22. C# Windows-Dienst - Standardargumente bei der Installation
- 23. Argumente, die auf andere Argumente mit argparse abhängig sind
- 24. Fix veränderbare Standardargumente via Metaklasse
- 25. Warum sind Blockvariablen optional?
- 26. Sind Standardargumente an einem beliebigen Punkt in der Argumentliste jemals möglich?
- 27. Überladen einer Methode für Standardargumente
- 28. Python - Konstruktor Argumente Argumente ohne Instanziierung
- 29. Warum wirft os.path.join Argumente weg?
- 30. Fragment newInstance warum Argumente verwenden?
Die Antwort, die Sie ausgewählt haben, beantwortet Ihre Frage überhaupt nicht. – juanchopanza