Betrachten Sie diese voll funktionsfähige Code:Indizes Trick für mehrere Komponenten verwendet
#include <type_traits>
template <typename T, typename IndexPack> struct Make;
template <typename T, template <T...> class P, T... Indices>
struct Make<T, P<Indices...>> {
using type = P<(Indices+1)..., (-3*Indices)..., (Indices-1)...>;
};
template <int...> class Pack;
int main() {
static_assert (std::is_same<Make<int, Pack<1,2,3,4>>::type,
Pack<2,3,4,5, -3,-6,-9,-12, 0,1,2,3>>::value, "false");
}
Was ich will eigentlich der Ausgang zu sein, ist
Pack<2,-3,0, 3,-6,1, 4,-9,2, 5,-12,3>
statt Pack<2,3,4,5, -3,-6,-9,-12, 0,1,2,3>
. Ich versuchte zuerst
using type = P<(Indices+1, -3*Indices, Indices-1)...>;
, aber das wird einfach vom Compiler als ein nutzloser Komma-Operator verstanden. Was ist die gewünschte Syntax um zu bekommen was ich will? Wenn es keine solche Syntax gibt, was ist der sauberste Weg, dies zu tun, wenn man bedenkt, dass die Verwendung von Indices
3 mal nur ein Beispiel ist (wir können es mehr als 3 mal verwenden). Bitte sag mir nicht, dass ich einen Helfer schreiben muss, um die einzelnen Pakete zu extrahieren und dann alle Elemente zu "verschachteln". Diese alptraumhafte Methode kann nicht die beste Lösung sein (und eine solche Lösung würde auch nur funktionieren, wenn wir genau wüssten, wie viele einzelne Pakete extrahiert werden müssen).
Würde die Definition
template <typename T, template <T...> class P, T I>
struct Component {
using type = P<I+1, -3*I, I-1>;
};
Hilfe irgendwie? Machen Sie eine Pack-Erweiterung auf diesem?
Ich bin nicht sicher, ob eine Funktion zu schreiben, etwas zu tun sind, so alptraum - es ist genau das, was Sie tun würden, wenn Sie das gleiche zu tun versuchen, etwas zur Laufzeit *. – Hurkyl
@Hurkyl. Es ist nicht so albtraumhaft, du hast Recht. Die Lösung von Columbo ist jedoch weitaus besser. – prestokeys