2017-11-06 4 views
1

Ich bin nicht sicher, was es wirklich ist, was ich versuche zu tun, also bitte entschuldigt mich, wenn der Titel nicht passt.Erstelle ein anderes Parameter Pack aus einem Parameter Pack

Ich habe eine Klassenvorlage, die ein Vorlagenparameterpaket nimmt. Ich möchte, dass der Konstruktor Typen erwartet, die von den Typen im Parameterpack abhängen, genauer gesagt möchte ich jedes Parameterpaketelement an eine andere Klassenvorlage (mit einem Argument) übergeben, um die Konstruktorparameter zu erstellen.

Das ist also die Struktur I Start bin heraus mit:

template<class ElementType> 
struct ElementPreset{ 
//... stores a preset for an element of ElementType 
}; 

template<class... Elements> 
class WidgetPreset{ 
    WidgetPreset(ElementPreset<Elements...> pPresets) 
     :presets(pPresets){} 

    std::tuple<ElementPreset<Elements...>> presets; 
} 

Der obige Code funktioniert nicht, aber was ich versuche zu tun, einen neuen Parameter Pack von Elements zu schaffen, in dem jedes Element ein ElementPreset<Element> anstelle von Element.

Gibt es dafür eine Sprachunterstützung in C++?

Antwort

3

Vielleicht

template <typename ... Elements> 
struct WidgetPreset{ 
    WidgetPreset(ElementPreset<Elements> ... pPresets) 
     :presets(pPresets...){} 

    std::tuple<ElementPreset<Elements>...> presets; 
}; 

ich meine ...

(1), wenn Sie eine class schaffen, ist alles private, wenn Sie es nicht public oder protected definieren; also Ihr class Konstrukt war private

(2) die a ElementPreset<Elements...> pPresets ist falsch: ElementPreset erhalten nur einen Typ; Sie haben nach der Art auspacken: ElementPreset<Elements> ... pPresets

(3) gleiches Problem mit dem Tupel: std::tuple<ElementPreset<Elements>...>, nicht std::tuple<ElementPreset<Elements...>>

(4), wenn Sie preset initialisieren haben Sie die Packung erweitern: presets(pPresets...) (oder presets{pPresets...}), nicht presets(pPresets)

(5) erinnern die ; am Ende des struct (oder class)

+0

@Justin - sind Sie sicher? Mein Code ist anders. – max66

+0

Nein [es funktioniert] (https://godbolt.org/g/HWUibq), ich habe es einfach vermasselt, als ich es kompilieren wollte. – Justin

+0

@Justin - Dinge, die passieren. – max66

Verwandte Themen