Boost logo

Boost Users :

Subject: Re: [Boost-users] Passing lambda placeholders to functions
From: Zachary Turner (divisortheory_at_[hidden])
Date: 2009-06-23 00:10:18


On Mon, Jun 22, 2009 at 6:31 PM, Steven Watanabe<watanabesj_at_[hidden]> wrote:
> AMDG
>
> Zachary Turner wrote:
>>
>> It seems very simple, but it's not compiling.
>>
>> int translate(const std::string& str)
>> {
>>   return 0;
>> }
>>
>> //all required using declarations are present but omitted for brevity
>> //
>> options_description options;
>> variables_map values;
>> int i;
>>
>> options.add_options()
>>   ("test", value<std::string>()->notifier(var(i) = translate(_1)));
>>
>> I get the following error:
>>
>> 'translate': cannot convert parameter 1 from
>> 'boost::lambda::placeholder1_type' to 'std::string'.  No user defined
>> conversion operator available that can perform this conversion, or the
>> operator cannot be called.
>>
>> Is this type of usage unsupported for some reason?
>
> It's unsupported because C++ doesn't allow Boost.Lambda to
> magically create overloads of every function that you might want to
> use with it.  Not to mention that if this usage did work, then trying
> to pass a lambda functor to a function would be ambiguous with
> trying to compose a larger lambda expression.
> Use bind.  http://tinyurl.com/nkhuez.
>

Thanks. On a related note, if a lambda placeholder refers to a
structure, is there any way to access its members short of using bind
and making a fake function to perform the access?

For example

struct foo { int x; int y; };
struct bar { int x, int y; };

foo f;

options.add_options()
   ("test", value<bar>()->notifier(
      var(f.x) = _1.x)));

is what I want. I've tried a variety of different things, most
promising seemed to be

options.add_options()
   ("test", value<bar>()->notifier(
      var(f.x) = bind(&bar::x, _1)));

but this doesn't work either. The only way I was able to get it to
work was to make a function

void copy_value(foo& dest, const bar& src)
{
   dest.x = src.x;
}

and then doing

options.add_options()
   ("test", value<bar>()->notifier(
      bind(copy_value, f, _1));

Is this my only hope?


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net