Universelle Aggregat-Initialisierung durch variadische Vorlagen

8

Das ist ein interessantes Problem, über das ich vor einiger Zeit nachgedacht habe. Gegeben ein struct mit einem zugrunde liegenden Aggregat:

%Vor%

Wie würden Sie den variadischen Vorlagenkonstruktor A(const T& value, const Ts& ... values) in

implementieren?
  • Akzeptieren Sie beide Werte vom Typ T und einem anderen A<T, N>
  • initialisiert das zugrundeliegende Aggregat basierend auf den Werten, die von den übergebenen Argumenten
  • repräsentiert werden
  • respektieren Sie die Kapazität des Aggregats
  • unterstützt C ++ 14 constexpr-Regeln und führt keinen Laufzeit-Overhead ein

Damit die obigen Anforderungen erfüllt werden, ist Folgendes möglich:

%Vor%     
plasmacel 27.03.2016, 17:03
quelle

2 Antworten

9

Hier ist ein Ansatz, der funktioniert, aber mit Sicherheit verbessert werden könnte.

Wir haben einen Konstruktor für A , der ein Parameter-Pack übernimmt, jedes Element in ein Tupel konvertiert, die Tupel zu einem großen Tupel zusammenfügt und dann einfach die Aggregat-Initialisierung aus diesem großen Tupel verwendet. Alle folgenden können constexpr sein, ich habe sie der Kürze wegen weggelassen.

Zuerst machen wir die Konvertierung:

%Vor%

Mit:

%Vor%

Und dann initialisieren wir einfach von dort:

%Vor%

Demo

    
Barry 27.03.2016, 17:24
quelle
5

Die Antwort von @Barry ist sicherlich richtig und akzeptabel. Aber es erfordert einige C ++ 14 Bibliothekserweiterungen (die Sie wahrscheinlich auch selbst in C ++ schreiben könnten 11), und insgesamt erfordert einige gute tuple - und Meta-Programmierung fu.

Betrachten wir mehrere Argumente als "Bereich von Bereichen", wobei ein Bereich nur ein Zeiger und eine Größe ist. Skalarargumente sind nur ein Bereich der Größe 1 und A<T, N> -Argumente sind Größen-N-Bereiche.

%Vor%

Sie können dann einfach eine Doppelschleife über alle Elemente aller Bereiche machen

%Vor%

Live-Beispiel arbeitet zur Kompilierungszeit (erfordert GCC & gt; = 6.0 oder Clang & gt; = 3.4)

%Vor%     
TemplateRex 27.03.2016 20:29
quelle