I tried to compile this code:
#include
#include
#include
int main() {
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.
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; })));
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; })));
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;