How to use std.bind?

2011-01-17 Thread Sean Eskapp
I used to use boost::bind all the time, but std.bind has me stumped, as I keep
getting static asserts with a cryptic "argument has no parameters" message. At
this point, the code is just:

class Foo
{
void bar(int i) { writeln(i); }
}

void main()
{
auto foobar = new Foo;
bind(&foobar.bar, 5)();
}

I've tried a myriad of different ways, but keep coming up with the same error.
Using bindAlias gives me an error that "std.bind.bindAlias(alias FT) is not a
function template.

I'm using DMD v2.051 on a Windows platform. Help anybody?


Re: How to use std.bind?

2011-01-17 Thread BlazingWhitester

On 2011-01-17 19:03:15 +0200, Sean Eskapp said:


I used to use boost::bind all the time, but std.bind has me stumped, as I keep
getting static asserts with a cryptic "argument has no parameters" message. At
this point, the code is just:

class Foo
{
void bar(int i) { writeln(i); }
}

void main()
{
auto foobar = new Foo;
bind(&foobar.bar, 5)();
}

I've tried a myriad of different ways, but keep coming up with the same error.
Using bindAlias gives me an error that "std.bind.bindAlias(alias FT) is not a
function template.

I'm using DMD v2.051 on a Windows platform. Help anybody?


std.bind is scheduled for deprecation, use lambda-expressions instead



Re: How to use std.bind?

2011-01-18 Thread Lars T. Kyllingstad
On Mon, 17 Jan 2011 17:03:15 +, Sean Eskapp wrote:

> I used to use boost::bind all the time, but std.bind has me stumped, as
> I keep getting static asserts with a cryptic "argument has no
> parameters" message. At this point, the code is just:
> 
> class Foo
> {
>   void bar(int i) { writeln(i); }
> }
> 
> void main()
> {
>   auto foobar = new Foo;
>   bind(&foobar.bar, 5)();
> }
> 
> I've tried a myriad of different ways, but keep coming up with the same
> error. Using bindAlias gives me an error that "std.bind.bindAlias(alias
> FT) is not a function template.
> 
> I'm using DMD v2.051 on a Windows platform. Help anybody?

Like BlazingWhitester said, std.bind is scheduled for deprecation.  (It 
will be marked as such starting with the next DMD release.)  It is a 
relic from D1, and I don't think it has worked well with D2 for quite a 
while.

Luckily, you don't need it at all.  You can do the same thing with D2's 
built-in features, such as nested functions and lambdas.

  // Lambda example
  int add2(int i) { return i + 2; }

  void main()
  {
  auto seven = () { return add2(5); };
  assert (seven() == 7);
  }

-Lars


Re: How to use std.bind?

2011-01-18 Thread Andrej Mitrovic
On 1/18/11, Lars T. Kyllingstad  wrote:
> On Mon, 17 Jan 2011 17:03:15 +, Sean Eskapp wrote:
>
>> I used to use boost::bind all the time, but std.bind has me stumped, as
>> I keep getting static asserts with a cryptic "argument has no
>> parameters" message. At this point, the code is just:
>>
>> class Foo
>> {
>>  void bar(int i) { writeln(i); }
>> }
>>
>> void main()
>> {
>>  auto foobar = new Foo;
>>  bind(&foobar.bar, 5)();
>> }
>>
>> I've tried a myriad of different ways, but keep coming up with the same
>> error. Using bindAlias gives me an error that "std.bind.bindAlias(alias
>> FT) is not a function template.
>>
>> I'm using DMD v2.051 on a Windows platform. Help anybody?
>
> Like BlazingWhitester said, std.bind is scheduled for deprecation.  (It
> will be marked as such starting with the next DMD release.)  It is a
> relic from D1, and I don't think it has worked well with D2 for quite a
> while.
>
> Luckily, you don't need it at all.  You can do the same thing with D2's
> built-in features, such as nested functions and lambdas.
>
>   // Lambda example
>   int add2(int i) { return i + 2; }
>
>   void main()
>   {
>   auto seven = () { return add2(5); };
>   assert (seven() == 7);
>   }
>
> -Lars
>

This is better:
http://www.digitalmars.com/d/2.0/phobos/std_functional.html#curry