Variadische (Template-)Argumente mit richtiger Reiehnfolge entpacken



  • Guten Abend! 🙂

    #include <vector>
    #include <string>
    #include <boost/algorithm/string.hpp>
    
    template<typename T>
    struct Parser { };
    
    template<>
    struct Parser<int> {
        static int parse(boost::iterator_range<std::string::iterator> const& toParse) {
            return std::stoi(std::string(toParse.begin(), toParse.end()));
        }
    };
    
    void foo(int a, int b) {
        std::cout <<  a << " " << b;
    }
    
    template<typename... Types>
    void bla(std::string& in) {
        boost::algorithm::trim(in);
        auto iter = boost::algorithm::make_split_iterator(in, boost::algorithm::first_finder(" ", boost::algorithm::is_equal()));
        foo(Parser<Types>::parse(*(iter++))...);
    }
    
    int main() {
        std::string line = "1 2";
        bla<int, int>(line);
    }
    

    Dieser Code gibt leider nicht "1 2" sondern "2 1" aus. Klar, das liegt sicher daran, dass die Evaluierungsreihenfolge der Parameter beim Funktionsaufruf nicht definiert ist.

    Bekommt man das irgendwie in der richtigen Reihenfolge hin? Mir ist der tuple-Trick grob bekannt, ist aber schon ziemlich "hacky". Außerdem würde ich gerne Kopien vermeiden, könnte ja mal ein fettes Objekt sein statt nur int.

    Vielen Dank & schöne Grüße,
    Ethon


  • Mod

    In Analogie zu https://www.c-plusplus.net/forum/342786 fällt mir ein:
    foo->struct foo

    struct foo {
        foo(int a, int b) {
            std::cout <<  a << " " << b;
        }
    };
    
    template<typename... Types>
    void bla(std::string& in) {
        boost::algorithm::trim(in);
        auto iter = boost::algorithm::make_split_iterator(in, boost::algorithm::first_finder(" ", boost::algorithm::is_equal()));
        foo{Parser<Types>::parse(*(iter++))...};
    }
    

  • Mod

    Das ist ja ein interessantes variadisches Template, dass nur für eine pack Länge funktioniert.



  • Super Camper, vielen dank, funktioniert perfekt. 👍

    @Arcoth: Funktioniert doch mit minimalen Anpassungen für jede pack Länge. 😉


Anmelden zum Antworten