Using Boost adaptors with C++11 lambdas

后端 未结 4 1198
我在风中等你
我在风中等你 2020-12-01 15:53

I tried to compile this code:

#include 
#include 
#include 

int main() {
             


        
相关标签:
4条回答
  • 2020-12-01 16:50

    http://smellegantcode.wordpress.com/2011/10/31/linq-to-c-or-something-much-better/

    But you can use this, that works well.

    #include <boost/range/adaptors.hpp>
    #include <boost/range/algorithm.hpp>
    #include <vector>
    #include <functional>
    
    int main() {
        std::vector<int> v{
            1,5,4,2,8,5,3,7,9
        };
        std::function<int(int)> func = [](int i) { return -i; };
        std::cout << *boost::min_element(v | boost::adaptors::transformed(
        func)) << std::endl;
        return 0;
    }
    

    http://liveworkspace.org/code/b78b3f7d05049515ac207e0c12054c70

    #define BOOST_RESULT_OF_USE_DECLTYPE works fine in VS2012 for example.

    0 讨论(0)
  • 2020-12-01 16:52

    With C++17 feature class template argument deduction you can wrap with std::function simplier, like this:

    *boost::min_element(
        v | boost::adaptors::transformed(std::function(
            [](int i) { return -i; })));
    
    0 讨论(0)
  • 2020-12-01 16:53

    This is covered at http://boost.2283326.n4.nabble.com/range-cannot-use-lambda-predicate-in-adaptor-with-certain-algorithms-td3560157.html and https://svn.boost.org/trac/boost/ticket/4189 - the problem is that some algorithms expect to be able to copy-construct (and default-construct, and copy-assign) their predicate, which can't be done with a lambda.

    The workaround is to wrap the lambda in a std::function:

    *boost::min_element(
        v | boost::adaptors::transformed(std::function<int(int)>(
            [](int i) { return -i; })));
    

    I've asked (at Inferring the call signature of a lambda or arbitrary callable for "make_function") for a way to write a make_function such that one can just write:

    *boost::min_element(
        v | boost::adaptors::transformed(make_function(
            [](int i) { return -i; })));
    
    0 讨论(0)
  • 2020-12-01 16:54

    You can turn a non-capturing lambda into a function pointer by putting a "+" in front of it.

    std::vector<int> v{1,5,4,2,8,5,3,7,9};
    std::cout << *boost::min_element(v | 
        boost::adaptors::transformed(+[](int i) 
        {
            return -i; 
        })) << std::endl;
    
    0 讨论(0)
提交回复
热议问题