delegate bug?

Ali Çehreli acehreli at yahoo.com
Fri Nov 9 10:52:56 PST 2012


On 11/09/2012 10:30 AM, Manfred Nowak wrote:
 > Jack Applegame wrote:
 >
 >> Ok. Then how to implement in D this С++ std::function feature?
 >>
 >> http://liveworkspace.org/code/01aa058901529f65cb9a3cc4ba605248
 >
 > That feature is among others defined here:
 > http://en.cppreference.com/w/cpp/utility/functional/function

The following D program produces the same output as the C++ example there:

import std.stdio : writeln;
import std.functional : curry;

struct Foo
{
     int num;

     void print_add(int i)
     {
         writeln(num + i);
     }
}

void print_num(int i)
{
     writeln(i);
}

void main()
{
     // store a free function
     auto f_display = &print_num;
     f_display(-9);

     // store a lambda
     auto f_display_42 = { print_num(42); };
     f_display_42();

     // store a curried call
     alias curry!(print_num, 31337) f_display_31337;
     f_display_31337();

     // store a call to a member function
     auto f_add_display = (Foo foo, int i) { return foo.print_add(i); };
     auto foo = Foo(314159);
     f_add_display(foo, 1);
}

D has more features:

     // store a call to a member function on a particular object
     auto f_print_add_on_object = &foo.print_add;
     f_print_add_on_object(2);

There is also std.functional.toDelegate:

   http://dlang.org/phobos/std_functional.html#toDelegate

Ali



More information about the Digitalmars-d-learn mailing list