was ist der Zweck der Typenname Zuweisung in Vorlagen

8

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:

  1. Was ist der Effekt der Zuweisung in template ?
  2. Was ist der Zweck der Verwendung im obigen Beispiel?
  3. Es gibt keine dritte Frage.

Jede Hilfe ist willkommen ..

EDIT herausgestellte Funktionen sind nur mit c ++ 11

kompilierbar     
none 26.11.2012, 13:52
quelle

6 Antworten

7

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.

    
Maciek 26.11.2012, 14:00
quelle
7

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.

    
Alexey Feldgendler 26.11.2012 13:58
quelle
6

Eine Funktionsvorlage ist möglicherweise nicht das beste Konstrukt, um Standardschablonenargumente zu demonstrieren. Hier ist etwas Ähnliches mit Template-Strukturen:

%Vor%

Wenn ich das ausführe, bekomme ich:

%Vor%     
eduffy 26.11.2012 14:00
quelle
2
  1. Die "Zuweisungen" in der Vorlagenparameterliste sind Standardparameter, genau wie in den Funktionsparameterlisten. Das heißt in Ihrem Beispiel ist 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> .
  2. Es wird nicht in Ihren Beispielen verwendet. Sie verwenden Foo überhaupt nicht, und die Parameter von baz und bar werden immer vom Compiler aus den gegebenen Argumenten abgeleitet.
Arne Mertz 26.11.2012 14:02
quelle
1

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

%Vor%

Hier haben Sie ein Standard-Template-Argument für Allocator , so dass Sie Vektoren mit nur einem Argument definieren können

%Vor%     
Olaf Dietsche 26.11.2012 14:01
quelle
-3

Was Sie suchen, ist "Template Spezialisierung"

Hier ist ein Link zu einigen Beispiel / Erläuterung

    
Arvind 26.11.2012 14:00
quelle

Tags und Links