Ich möchte eine Funktion erstellen, die eine variable Anzahl von Template-Argumenten akzeptiert. Später mit diesen Argumenten sollte die Funktion ihre Position so übergeben:
%Vor%Der angegebene Code ist natürlich nicht kompilierbar. Gibt es eine Möglichkeit, es zu beheben? Gibt es eine Möglichkeit, dies ohne variante Vorlagen ohne zu viel Code-Duplizierung zu tun?
Ja, das ist möglich:
%Vor%Mit diesen Helfern benötigen Sie einen Forwarder für Ihre Funktion:
%Vor% BEARBEITEN: Wie funktioniert es? Zuerst ermitteln wir die Größe des Argumentpakets Args
bis sizeof...
. make_indices<N>::type
wird dann in indices<0,1,2,...,N-1>
erweitert. Es wird als zusätzlicher Parameter für die Implementierungsfunktion angegeben (von der Weiterleitung, die nur eine Dummy-Instanz erstellt), daher beginnt der Argumentabzug auf der Seite der Implementierungsfunktion und setzt die generierten Indizes in das Argument pack Ns
.
Die Implementierungsfunktion hat nun zwei Argumentpakete mit der gleichen Größe, nämlich Args
und Ns
. Wenn sie durch die Ellipse ...
erweitert wird, erweitert die Ellipse den ganzen Ausdruck , auf den sie angewendet wird, und sie erweitert alle Parameterpakete parallel! Im obigen Beispiel ist dieser Ausdruck read<Args>(Data, Ns+1)
, was sich gut in den Pseudocode des OPs erweitert.
Tags und Links c++ c++11 variadic-templates