[Lambda] Getting the bind incantation correct.

Hi All I'm trying to use std::vector::push_back() within a Boost.Lambda expression, but am finding it impossible to bind correctly. Can anyone tell me what I'm doing wrong in this code? Thanks in advance, - Rob. #include <vector> #include <boost/function.hpp> #include <boost/lambda/bind.hpp> void f( ) { namespace ll = boost::lambda; using boost::function; typedef unsigned char Id; typedef std::vector<Id> Ids; ll::placeholder1_type x; Ids ids; void ( Ids::* push_back )( const Ids::value_type & ) = & Ids::push_back; function<void(Id)> my_push = ll::bind( push_back, ids, x ); // Line 18 (void)my_push; }
g++ ignore.cpp
[...lots of template instantiation errors, then...] ignore.cpp:18: instantiated from here /usr/include/boost/lambda/detail/actions.hpp:96: error: no matching function for call to ‘boost::lambda::function_adaptor<void (std::vector<unsigned char, std::allocator<unsigned char> >::*)(const unsigned char&)>::apply(void (std::vector<unsigned char, std::allocator<unsigned char> >::* const&)(const unsigned char&), const std::vector<unsigned char, std::allocator<unsigned char> >&, unsigned char&)’ /usr/include/boost/lambda/detail/actions.hpp:96: error: return-statement with a value, in function returning 'void'

On Mon, May 23, 2011 at 6:25 PM, Robert Jones <robertgbjones@gmail.com>wrote:
Hi All
I'm trying to use std::vector::push_back() within a Boost.Lambda expression, but am finding it impossible to bind correctly. Can anyone tell me what I'm doing wrong in this code?
Thanks in advance,
- Rob.
#include <vector> #include <boost/function.hpp> #include <boost/lambda/bind.hpp>
void f( ) { namespace ll = boost::lambda; using boost::function;
typedef unsigned char Id; typedef std::vector<Id> Ids;
ll::placeholder1_type x;
Ids ids; void ( Ids::* push_back )( const Ids::value_type & ) = & Ids::push_back;
function<void(Id)> my_push = ll::bind( push_back, ids, x ); // Line 18
Change ids to ll:var(ids) because the operation 'push_back' needs a mutable object.
(void)my_push; }
g++ ignore.cpp
[...lots of template instantiation errors, then...]
ignore.cpp:18: instantiated from here /usr/include/boost/lambda/detail/actions.hpp:96: error: no matching function for call to ‘boost::lambda::function_adaptor<void (std::vector<unsigned char, std::allocator<unsigned char> >::*)(const unsigned char&)>::apply(void (std::vector<unsigned char, std::allocator<unsigned char> >::* const&)(const unsigned char&), const std::vector<unsigned char, std::allocator<unsigned char> >&, unsigned char&)’ /usr/include/boost/lambda/detail/actions.hpp:96: error: return-statement with a value, in function returning 'void'
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users

On Mon, May 23, 2011 at 11:42 AM, 肖锋 <xfxyjwf@gmail.com> wrote:
On Mon, May 23, 2011 at 6:25 PM, Robert Jones <robertgbjones@gmail.com>wrote:
Hi All
I'm trying to use std::vector::push_back() within a Boost.Lambda expression, but am finding it impossible to bind correctly. Can anyone tell me what I'm doing wrong in this code?
Thanks in advance,
- Rob.
#include <vector> #include <boost/function.hpp> #include <boost/lambda/bind.hpp>
void f( ) { namespace ll = boost::lambda; using boost::function;
typedef unsigned char Id; typedef std::vector<Id> Ids;
ll::placeholder1_type x;
Ids ids; void ( Ids::* push_back )( const Ids::value_type & ) = & Ids::push_back;
function<void(Id)> my_push = ll::bind( push_back, ids, x ); // Line 18
Change ids to ll:var(ids) because the operation 'push_back' needs a mutable object.
(void)my_push; }
g++ ignore.cpp
[...lots of template instantiation errors, then...]
ignore.cpp:18: instantiated from here /usr/include/boost/lambda/detail/actions.hpp:96: error: no matching function for call to ‘boost::lambda::function_adaptor<void (std::vector<unsigned char, std::allocator<unsigned char> >::*)(const unsigned char&)>::apply(void (std::vector<unsigned char, std::allocator<unsigned char> >::* const&)(const unsigned char&), const std::vector<unsigned char, std::allocator<unsigned char> >&, unsigned char&)’ /usr/include/boost/lambda/detail/actions.hpp:96: error: return-statement with a value, in function returning 'void'
Ok, many thanks, that worked. But why isn't "ids" mutable on its own? - Rob.

On Mon, May 23, 2011 at 12:43 PM, Robert Jones <robertgbjones@gmail.com>wrote:
On Mon, May 23, 2011 at 11:42 AM, 肖锋 <xfxyjwf@gmail.com> wrote:
On Mon, May 23, 2011 at 6:25 PM, Robert Jones <robertgbjones@gmail.com>wrote:
Hi All
I'm trying to use std::vector::push_back() within a Boost.Lambda expression, but am finding it impossible to bind correctly. Can anyone tell me what I'm doing wrong in this code?
Thanks in advance,
- Rob.
#include <vector> #include <boost/function.hpp> #include <boost/lambda/bind.hpp>
void f( ) { namespace ll = boost::lambda; using boost::function;
typedef unsigned char Id; typedef std::vector<Id> Ids;
ll::placeholder1_type x;
Ids ids; void ( Ids::* push_back )( const Ids::value_type & ) = & Ids::push_back;
function<void(Id)> my_push = ll::bind( push_back, ids, x ); // Line 18
Change ids to ll:var(ids) because the operation 'push_back' needs a mutable object.
(void)my_push; }
g++ ignore.cpp
[...lots of template instantiation errors, then...]
ignore.cpp:18: instantiated from here /usr/include/boost/lambda/detail/actions.hpp:96: error: no matching function for call to ‘boost::lambda::function_adaptor<void (std::vector<unsigned char, std::allocator<unsigned char> >::*)(const unsigned char&)>::apply(void (std::vector<unsigned char, std::allocator<unsigned char> >::* const&)(const unsigned char&), const std::vector<unsigned char, std::allocator<unsigned char> >&, unsigned char&)’ /usr/include/boost/lambda/detail/actions.hpp:96: error: return-statement with a value, in function returning 'void'
Ok, many thanks, that worked. But why isn't "ids" mutable on its own?
Ahh, ok, answered my own question.... When "ids" is passed to the binder by reference a const copy is made inside the binder, and it is this which push_back attempts to modify, producing an error. Pass by pointer or use var. Thanks again. - Rob.

On Mon, May 23, 2011 at 2:06 PM, Robert Jones <robertgbjones@gmail.com> wrote:
On Mon, May 23, 2011 at 12:43 PM, Robert Jones <robertgbjones@gmail.com> wrote:
On Mon, May 23, 2011 at 11:42 AM, 肖锋 <xfxyjwf@gmail.com> wrote:
On Mon, May 23, 2011 at 6:25 PM, Robert Jones <robertgbjones@gmail.com> wrote:
Hi All I'm trying to use std::vector::push_back() within a Boost.Lambda expression, but am finding it impossible to bind correctly. Can anyone tell me what I'm doing wrong in this code? Thanks in advance, - Rob. #include <vector> #include <boost/function.hpp> #include <boost/lambda/bind.hpp> void f( ) { namespace ll = boost::lambda; using boost::function; typedef unsigned char Id; typedef std::vector<Id> Ids; ll::placeholder1_type x; Ids ids; void ( Ids::* push_back )( const Ids::value_type & ) = & Ids::push_back; function<void(Id)> my_push = ll::bind( push_back, ids, x ); // Line 18
Change ids to ll:var(ids) because the operation 'push_back' needs a mutable object.
(void)my_push; }
g++ ignore.cpp [...lots of template instantiation errors, then...] ignore.cpp:18: instantiated from here /usr/include/boost/lambda/detail/actions.hpp:96: error: no matching function for call to ‘boost::lambda::function_adaptor<void (std::vector<unsigned char, std::allocator<unsigned char> >::*)(const unsigned char&)>::apply(void (std::vector<unsigned char, std::allocator<unsigned char> >::* const&)(const unsigned char&), const std::vector<unsigned char, std::allocator<unsigned char> >&, unsigned char&)’ /usr/include/boost/lambda/detail/actions.hpp:96: error: return-statement with a value, in function returning 'void'
Ok, many thanks, that worked. But why isn't "ids" mutable on its own?
Ahh, ok, answered my own question.... When "ids" is passed to the binder by reference a const copy is made inside the binder, and it is this which push_back attempts to modify, producing an error. Pass by pointer or use var. Thanks again. - Rob.
<shameless plug> You could have just used Phoenix: http://beta.boost.org/doc/libs/1_47_0_snapshot/libs/phoenix/doc/html/phoenix... It comes with push_back and all kind of other functions to support stdlib-like containers and algorithm directly. </shameless plug>
participants (3)
-
Robert Jones
-
Thomas Heller
-
肖锋