Ich bin auf dieses Stück Code gestoßen (ich versuche, alle Details aufzunehmen, falls mir etwas fehlt):
%Vor%Und der Teil, den ich nicht verstehe, sind die Zuweisungen in der Vorlage:
%Vor%Ich habe versucht, die Wirkung davon zu verstehen, aber bisher konnte ich keine produzieren. Hier sind einige Dinge, die ich versucht habe:
%Vor%wird ausgedruckt:
%Vor%Meine Frage ist also:
template
? Jede Hilfe ist willkommen ..
EDIT herausgestellte Funktionen sind nur mit c ++ 11
kompilierbar Dies wird "Standardschablonenargument" genannt und spezifiziert, welcher Typ verwendet wird, wenn keiner angegeben wird - wie Standardfunktionsparameter. Diese Technik wird häufig für Klassen verwendet - sehen Sie sich die Definition von std::vector
oder std::string
, und Sie werden sehen, dass sie mehrere Standardtyp-Parameter haben.
Die beste Verwendung von Standard-Typparametern für Funktionsschablonen ist, wenn das Argument type nicht einfach aus tatsächlichen Argumenten abgeleitet werden kann und nicht explizit angegeben wird - dann verwendet der Compiler den Standard-Parameter. In Ihrem Beispiel sind keine Standardtypen erforderlich, da diese einfach aus den tatsächlichen Aufrufparametern abgeleitet werden können.
Bis C ++ 0x waren Standardtyp-Parameter nur für Klassenvorlagen erlaubt - sie konnten nicht mit Funktionsschablonen verwendet werden. Mit C ++ 0x hat es sich geändert, aber einige ältere Compiler (zum Beispiel Visual C ++ 2008) ließen Sie diese nicht verwenden.
Dies sind keine Zuweisungen, sondern "Standardwerte" für die Typargumente der Vorlage, ähnlich wie es eine ähnliche Syntax für Standardwertargumente von Funktionen gibt. Sie werden verwendet, wenn kein explizites Argument angegeben wird.
Für bar
und baz
Funktionsvorlagen in Ihrem Beispiel macht das keinen Sinn, denn für diese Funktionen wird T
von den angegebenen Argumenten abgeleitet.
Foo<>
dasselbe wie Foo<TYPE_with_an_arbitrarily_long_name, KIND_with_an_arbitrarily_long_name>
und Foo<int>
ist dasselbe wie Foo<int, KIND_with_an_arbitrarily_long_name>
. Foo
überhaupt nicht, und die Parameter von baz
und bar
werden immer vom Compiler aus den gegebenen Argumenten abgeleitet. Dies sind Standardvorlagenargumente. Sie können Vorlagen-Standardargumente verwenden, um ihre Verwendung zu vereinfachen.
Wenn Sie beispielsweise zwei Vorlagenparameter haben und der letzten einen Standardtyp geben, müssen Sie nur einen Typ angeben.
std::vector
ist beispielsweise definiert als
Hier haben Sie ein Standard-Template-Argument für Allocator
, so dass Sie Vektoren mit nur einem Argument definieren können
Was Sie suchen, ist "Template Spezialisierung"
Hier ist ein Link zu einigen Beispiel / Erläuterung