decltype in lambdas



  • Problem:

    Nehmen wir mal an, wie haben einen vector<int>.
    Mit diesem vector arbeiten wir und zum schluss wollen wir alles ausgeben.
    Dies würde ungefähr so aussehen mit for_each und einem lambda:

    std::vector<int> v;
    
    ...
    
    std::for_each(v.begin(),v.end(),[](const int &e){std::cout << e});
    

    Allerdings wollen wir nun auch Fließkommazahlen unterstützen.
    Also wird der vector mit floats definiert.

    Das Problem dabei ist, dass auch bei der lambda Funktion der Typ geändert werden muss. (Dasselbe wäre auch, wenn wir z.B. den Container ändern)

    Damit man die Typen bei Lambdas nicht ändern muss, ist decltype eine sehr interessante Methode, den Typ des eingesetzten Containers und den Typ automatisch zu ermitteln.

    So wäre es bei der bei dieser Variante möglich, den Container auf z.B. Ein std::array zu wechseln oder statt int ein float oder string zu nehmen.

    std::vector<float> v; //Dies kann z.B. auch ein std::array<int,3> sein
    
    ...
    
    std::for_each(v.begin(),v.end(),[](decltype(*v.begin()) &e){std::cout << e;});
    

    oder gibt es dazu eine andere elegantere Lösung?

    Eine weitere Lösung wäre es auch, den Typ mittels typedef zu definieren.
    dies würde aber mehr Verwaltung und mehr Schreibarbeit bedeuten

    P.S.: Dies ist nur mal so ein Gedanke, den ich mit VS2010 ausprobiert habe.
    Falls dies nicht vom Standard vorgesehen ist, bitte ich, das ihr mich korrigiert.



  • Man kann natürlich auch einfach typedef benutzen, um einen Alias einzuführen. Dann muss man auch nur eine einzige Stelle ändern (die typedef-Zeile), wenn der Typ geändert werden soll.

    typedef float elementtyp;
    ...
    vector<elementtyp> vec;
    ...
    for_each(vec.begin(),vec.end(),[](elementtyp x) {...});
    

    Und sonst, ja, decltype kann sehr sehr praktisch. 🙂


Anmelden zum Antworten