Warum sind Standardvorlagenargumente nur für Klassenvorlagen zulässig? Warum können wir keinen Standardtyp in einer Elementfunktionsvorlage definieren? Beispielsweise:
struct mycclass {
template<class T=int>
void mymember(T* vec) {
// ...
}
};
Stattdessen erzwingt C ++, dass Standardvorlagenargumente nur für eine Klassenvorlage zulässig sind.
struct S { template <class R = int> R get_me_R() { return R(); } };
Der Vorlagenparameter kann nicht aus dem Kontext abgeleitet werden.template <int N = 1> int &increment(int &i) { i += N; return i; }
und dannincrement(i);
oderincrement<2>(i);
. So wie es ist, muss ich schreibenincrement<1>(i);
.Antworten:
Es ist sinnvoll, Standardvorlagenargumente anzugeben. Zum Beispiel könnten Sie eine Sortierfunktion erstellen:
C ++ 0x führt sie in C ++ ein. Siehe diesen Fehlerbericht von Bjarne Stroustrup: Standardvorlagenargumente für Funktionsvorlagen und was er sagt
quelle
double
in meinem Fall) gelöst . Vielleicht ist es nicht "allgemein", aber gibt es einen Nachteil bei dieser Praxis? Vielen Dank.error: invalid conversion from ‘int’ to ‘int*’
einer Idee, warum: `#include <array> #include <algorithm> #include <functional> template <Typname Iterator, Typname Comp = std :: less <Iterator>> void my_sort ( Iterator betteln, Iteratorende, Comp c = Comp ()) {std :: sort (betteln, enden, c); } int main () {std :: array <int, 5> ar {5,2,21,7,4}; my_sort (ar.begin (), ar.end ()); } `So zitieren Sie C ++ - Vorlagen: Das vollständige Handbuch (Seite 207):
quelle
Bisher können alle angebotenen Beispiele für Standardvorlagenparameter für Funktionsvorlagen mit Überladungen erstellt werden.
AraK:
könnte sein:
Mein eigenes:
könnte sein:
litb:
könnte sein:
Stroustrup:
Könnte sein:
Was ich mit folgendem Code bewiesen habe:
Die gedruckte Ausgabe stimmt mit den Kommentaren für jeden Aufruf von f überein, und der auskommentierte Aufruf kann nicht wie erwartet kompiliert werden.
Ich vermute also, dass Standardvorlagenparameter "nicht benötigt" werden, aber wahrscheinlich nur in dem Sinne, dass Standardfunktionsargumente "nicht benötigt werden". Wie aus dem Fehlerbericht von Stroustrup hervorgeht, war das Hinzufügen nicht abgeleiteter Parameter zu spät, als dass jemand erkennen und / oder wirklich einschätzen könnte, dass dies die Standardeinstellungen nützlich machte. Die aktuelle Situation basiert also auf einer Version von Funktionsvorlagen, die nie Standard war.
quelle
template<typename T = void> int SomeFunction();
. Der Template-Parameter wird hier niemals verwendet, und tatsächlich wird die Funktion niemals aufgerufen. Der einzige Ort, auf den es sich bezieht, ist eindecltype
odersizeof
. Der Name stimmt absichtlich mit dem Namen einer anderen Funktion überein, aber die Tatsache, dass es sich um eine Vorlage handelt, bedeutet, dass der Compiler die freie Funktion bevorzugt, falls vorhanden. Die beiden werden in SFINAE verwendet, um ein Standardverhalten bereitzustellen, bei dem eine Funktionsdefinition fehlt.Unter Windows können Sie mit allen Versionen von Visual Studio diesen Fehler ( C4519 ) in eine Warnung konvertieren oder wie folgt deaktivieren:
Weitere Details finden Sie hier .
quelle
Was ich benutze, ist der nächste Trick:
Nehmen wir an, Sie möchten eine Funktion wie diese haben:
Du wirst nicht erlaubt sein, aber ich mache den nächsten Weg:
Auf diese Weise können Sie es folgendermaßen verwenden:
Wie wir sehen können, muss der zweite Parameter nicht explizit eingestellt werden. Vielleicht ist es für jemanden nützlich.
quelle