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 🙂


  • Mod

    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 😕


  • Mod

    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.


Anmelden zum Antworten