pointer to member without 'this' - mem_fun like
Frits van Bommel
fvbommel at REMwOVExCAPSs.nl
Tue Mar 18 08:02:10 PDT 2008
Vlad wrote:
> Example: writing a map()-like function that works on a collection of
> objects and calling a method on them, instead of a free function
>
> Pseudocode:
> (with a 'free function'):
>
> string in[] = ...
> int out[] = map (in, len);
>
> (with a 'member_fun'):
> T in[] = ...
> T out[] = map(in, &T.do_something);
>
> or even:
> T in[] = ...
> int out[] = map(in, &T.get_some_int_property)
Normal D way to do something like this:
---
// Note: 'in' and 'out' are keywords so they can't be used as variables
T[] input = ...
// free function:
int[] out1 = map (input, &len); // if map accepts raw function pointers
// otherwise, use something like below
// member function:
U[] out2 = map(input, (T t) { return t.do_something; });
// or even:
int[] out3 = map(input, (T t) { op1(t); op2(t); return op3(t); });
---
It's a bit longer, but doesn't require extra getters & setters just for
this.
The second parameter to map in the latter two examples is a delegate
literal; it can contain any block of code, and can even access local
variables in the surrounding code if needed.
You'll need to overload map (or turn it into a template function) if you
want to also accept function pointers as in my first example. Of course
if you want it to allow multiple input and output array types it'll have
to be a template function anyway so that shouldn't be a problem.
P.S. Normally the operation to apply is the *first* parameter to a
function called 'map'.
More information about the Digitalmars-d-learn
mailing list