Variadic Template Problem
-
Hi,
folgender Code
// Soll Entities zurückgeben, die alle Components der Typen //First + alle in Args besitzen // ist eine Memberfunktion template <typename First, typename ...Args> Entities getEntitiesWith() { Entities output; auto s1 = getEntities<First>(); // Gibt Entities mit Component vom Typ First zurück auto s2 = getEntitiesWith<Args...>(); std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(output, output.end())); return output; }
Der Erfahrene wird wohl direkt merken, dass es im Falle von Args = {} Probleme gibt. Ich weiß nicht, wie ich dem Compiler klarmache, dass im Falle von keiner weiteren Argumente außer First, eine Spezialisierung von "getEntitiesWith" verwendet werden soll. Wäre dankbar für Hilfe
-
Wie sieht denn die Spezialisierung für das Ende bei dir aus und was genau funktioniert daran nicht?
-
Hey, danke für die schnelle Antwort
Habe direkt nach deiner Frage gemerkt, dass der Ansatz so nicht ganz funktionieren kann, da als letztes keine leere Menge zurückgegeben werden darf. (Wollte bis Null Templateargumente runtergehen)
Hier ist nun mein Ansatz:
template <typename First> Entities getEntitiesWith() { std::cout << "test"; return getEntities<First>(); } template <typename First, typename Second, typename ...Args> Entities getEntitiesWith() { Entities output; auto s1 = getEntities<First>(); auto s2 = getEntitiesWith<Second, Args...>(); std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(output, output.end())); return output; }
Der funktioniert. Sorry für den Thread
Edit:
Andere Frage:
Gibts mittlerweile eine vernünftige Möglichkeit auch bei Templates Deklaration und Definition zu trennen? Bei vielen Templatemembern wirds hässlich
-
Du kannst Templates ganz normal deklarieren, wie alles andere auch. Immer schon. Es bringt bloß nicht sehr viel, denn die Definition muss letztlich immer noch vorliegen, wenn das Template instantiiert werden soll. Ich bin aber auch nicht wirklich sicher, was du mit solch einer Trennung genau erreichen möchtest.
-
kingcools schrieb:
Gibts mittlerweile eine vernünftige Möglichkeit auch bei Templates Deklaration und Definition zu trennen? Bei vielen Templatemembern wirds hässlich
Du kannst die Definitionen in eine separate Datei schreiben, die du dann anschließend direkt unter den Deklarationen inkludierst.