Thread overview
Can't use map (and friends) for virtual functions?
Apr 25, 2011
Andrej Mitrovic
Apr 26, 2011
bearophile
Apr 26, 2011
Andrej Mitrovic
April 25, 2011
import std.algorithm;

struct Foo
{
    int bar(string) { return 1; }

    void run()
    {
        auto result = map!(bar)(["test"]);
    }
}

void main()
{
}

D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\algorithm.d(128): Error: this for bar needs to be type Foo not type Map!(bar,string[])

I can't use a virtual function as an alias parameter to a template, it either has to be a free function or a static function.

So basically I have to use delegates:

import std.algorithm;
import std.traits;
import std.stdio;

auto myMap(Delegate, Range)(Delegate dg, Range t)
{
    ReturnType!(dg)[] result;

    foreach (val; t)
    {
        result ~= dg(val);
    }

    return result;
}

struct Foo
{
    int bar(string) { return 1; }

    void run()
    {
        auto result = myMap(&bar, ["test", "test"]);
        writeln(result);
    }
}

void main()
{
    auto foo = Foo();
    foo.run();
}

But this means I have to take every Phobos function which I need and which takes an alias and convert it to a delegate version if I ever want to use it inside a struct or a class for non-static functions.

Can't Phobos functions be made smarter so they work with virtual functions? Or would "alias" need re-engineering?
April 26, 2011
Andrej Mitrovic:

> import std.algorithm;
> 
> struct Foo
> {
>     int bar(string) { return 1; }
> 
>     void run()
>     {
>         auto result = map!(bar)(["test"]);
>     }
> }
> 
> void main()
> {
> }
> 
> D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\algorithm.d(128): Error: this for bar needs to be type Foo not type Map!(bar,string[])
> 
> I can't use a virtual function as an alias parameter to a template, it either has to be a free function or a static function.

Where's the virtual function?

Bye,
bearophile
April 26, 2011
On Tue, 26 Apr 2011 07:24:28 -0400, bearophile <bearophileHUGS@lycos.com> wrote:

> Andrej Mitrovic:
>
>> import std.algorithm;
>>
>> struct Foo
>> {
>>     int bar(string) { return 1; }
>>
>>     void run()
>>     {
>>         auto result = map!(bar)(["test"]);
>>     }
>> }
>>
>> void main()
>> {
>> }
>>
>> D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\algorithm.d(128): Error: this for bar needs to be type Foo not type Map!(bar,string[])
>>
>> I can't use a virtual function as an alias parameter to a template, it either has to be a free function or a static function.
>
> Where's the virtual function?

I think he means member function.  Clearly the function is not virtual.

-Steve
April 26, 2011
Yeah my bad, I've cut&paste code while thinking of similar code.