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).
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.
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.
Tags und Links c++ templates template-specialization