Mehrere typename Argumente in C ++ Vorlage?

8

Wie kann ich mehrere Typname Argumente in einer C ++ Vorlage haben?

%Vor%

Verwendung:

%Vor%

Aber es wird nicht kompiliert. Wie könnte ich es kompilieren lassen?

    
Jichao 12.11.2013, 07:31
quelle

5 Antworten

24

Deklarieren Sie einfach eine primäre Vorlage mit einer variadischen Vorlage und spezialisieren Sie sich dann für jede unterstützte Anzahl von Vorlagenargumenten. Zum Beispiel:

%Vor%

I Sie können C ++ 11 nicht verwenden und Sie möchten eine ähnliche Notation beibehalten, die Sie benötigen, um eine variadische Argumentliste mit Vorlagenstandardargumenten zu simulieren. Dies begrenzt implizit die Anzahl der Templar-Argumente, aber da Sie die Templates ohnehin spezialisieren, ist diese Einschränkung nicht wirklich wichtig.

Wenn es akzeptabel ist, eine andere Notation zu verwenden, können Sie auch etwas verwenden, das wie eine Funktionsdeklaration aussieht, um Ihre Vorlage zu instanziieren und zu spezialisieren:

%Vor%

Ob die Änderung der Notation akzeptabel ist, hängt von Ihrer Verwendung der Klassenvorlage ab. Sie werden jedoch keine ideale Lösung wie bei variantenbasierten Vorlagen ohne C ++ 11 erreichen.

BTW, nicht überbeanspruchen std::endl :% verwenden co_de% bedeutet Zeilenende. Wenn Sie den Stream wirklich löschen möchten, verwenden Sie '\n' . Außerdem ist std::flush ein Name, der für die C ++ - Standardbibliothek reserviert ist, wie alle Namen, die mit einem Unterstrich beginnen, gefolgt von einem Großbuchstaben: nicht verwenden Sie diese Namen in Ihrem eigenen Code, es sei denn, es gibt explizite Erlaubnis zu verwenden sie (z. B. _CALL_TEMP_H und __FILE__ sind reserviert, aber die ausdrückliche Erlaubnis, sie zu verwenden, wird gewährt).

    
Dietmar Kühl 12.11.2013, 07:44
quelle
1

Wenn Sie mehrere Versionen einer Vorlage haben, müssen Sie eine einzelne Version spezialisieren. Wenn Sie eine andere Anzahl von Argumenten haben möchten, besteht der Trick darin, eine Tag-Klasse zu verwenden, um "dieses Argument ist kein Argument" zu sagen, und dieses als Standardargument zu haben.

In Ihrem Fall, etwas wie die folgenden Arbeiten (kompiliert und getestet):

%Vor%

Beachten Sie, dass dies im Wesentlichen eine Neuerfindung von boost :: tuple & lt; & lt; / std :: tuple & lt; & gt; ist, die Sie unbedingt lesen sollten.

    
Kaz Dragon 12.11.2013 07:40
quelle
0

Ich denke, Sie verwechseln die Spezialisierung mit dem Überladen desselben Klassennamens. Sie können keine Klasse mit demselben Namen mit mehreren Vorlagenargumenten erstellen.

    
legends2k 12.11.2013 07:40
quelle
0

Sie können nicht. Sie deklarieren Foo in zwei Formaten. Eins mit 2 Vorlagenargumenten und ein weiteres mit 3.

Versuchen Sie Spezialisierung:

%Vor%     
deepmax 12.11.2013 07:39
quelle
0

Es wird nicht kompiliert, weil Sie dieselbe Klasse nicht mehrfach mit einer anderen Anzahl von Vorlagenargumenten definieren können.

Wenn Sie die maximale Anzahl an Vorlagenparametern kennen, die Sie unterstützen möchten, können Sie eine Teilspezialisierung verwenden:

%Vor%

Wenn Sie C ++ 11 verwenden, wäre eine andere Option, variadische Vorlagen zu verwenden.

    
Tristan Brindle 12.11.2013 07:49
quelle