Das ist ein interessantes Problem, über das ich vor einiger Zeit nachgedacht habe.
Gegeben ein struct
mit einem zugrunde liegenden Aggregat:
Wie würden Sie den variadischen Vorlagenkonstruktor A(const T& value, const Ts& ... values)
in
T
und einem anderen A<T, N>
Damit die obigen Anforderungen erfüllt werden, ist Folgendes möglich:
%Vor%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% 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.
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%Tags und Links c++ c++11 templates variadic-templates c++14