boost: lambda <-> phoenix [gelöst]



  • Was sind die grundlegenden Unterschiede zwischen boost::lambda und boost::phoenix?

    Ich hab hier ein Beispiel geschrieben, das alle ungeraden Zahlen eines Vektors in einen neuen Vektor schreibt und ausgibt, und zwar einmal mit lambda und einmal mit phoenix, und beides sieht ziemlich gleich aus:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    #include <boost/lambda/lambda.hpp>
    #include <boost/lambda/if.hpp>
    #include <boost/lambda/bind.hpp>
    
    #include <boost/spirit/include/phoenix.hpp>
    
    int main()
    {
        std::vector<int> container;
        for(size_t i = 0; i < 10; ++i)
        {
            container.push_back(rand() % 100);
        }
        {//lamba:
            namespace lambda = boost::lambda;
            std::vector<int> oddValues;
            std::for_each(container.begin(), container.end(),
                lambda::if_(lambda::_1 % 2 != 0) [lambda::bind(&std::vector<int>::push_back, &oddValues, lambda::_1)]);
            std::for_each(oddValues.begin(), oddValues.end(), std::cout << lambda::_1 << ' ');
            std::cout << std::endl;
        }
        {//phoenix:
            namespace phoenix = boost::phoenix;
            std::vector<int> oddValues;
            std::for_each(container.begin(), container.end(),
                phoenix::if_(phoenix::arg_names::_1 % 2 != 0) [phoenix::push_back(phoenix::ref(oddValues), phoenix::arg_names::_1)]);
            std::for_each(oddValues.begin(), oddValues.end(), std::cout << phoenix::arg_names::_1 << ' ');
            std::cout << std::endl;
        }
        return 0;
    }
    


  • Es gibt anscheinend tatsächlich keinen Unterschied, daher sollen die beiden Bibliotheken wohl auch zusammengelegt werden.



  • Mit C++0x ergibt sich das dann eh.

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    int main() {
    	std::vector<int> container(10);
        for(size_t i = 0; i < 10; ++i) {
            container[i] = i;
        }
    	std::vector<int> vec;
    	std::for_each(container.begin(), container.end(), [&](int e) {
    		if(e % 2 != 0)
    			vec.push_back(e);
    	});
    	std::for_each(vec.begin(), vec.end(), [](int e) {
    		std::cout << e << ' ';
    	});
    	std::cin.get();
    }
    


  • Wobei man hier geradeso gut die Foreach-Schleife verwenden könnte. 😉



  • Nexus schrieb:

    Wobei man hier geradeso gut die Foreach-Schleife verwenden könnte. 😉

    Meinst du das hier:
    http://en.wikipedia.org/wiki/C%2B%2B0x#Range-based_for-loop
    ?

    Das finde ich sehr nett. 🙂



  • Ja, genau das meinte ich. Wofür man heutzutage eben noch BOOST_FOREACH braucht.


Anmelden zum Antworten