digitalmars.D.learn - Can't use map (and friends) for virtual functions?
- Andrej Mitrovic (47/47) Apr 25 2011 import std.algorithm;
- bearophile (4/23) Apr 26 2011 Where's the virtual function?
- Steven Schveighoffer (4/27) Apr 26 2011 I think he means member function. Clearly the function is not virtual.
- Andrej Mitrovic (1/1) Apr 26 2011 Yeah my bad, I've cut&paste code while thinking of similar code.
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?
Apr 25 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
Apr 26 2011
On Tue, 26 Apr 2011 07:24:28 -0400, bearophile <bearophileHUGS lycos.com> wrote:Andrej Mitrovic:I think he means member function. Clearly the function is not virtual. -Steveimport 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?
Apr 26 2011
Yeah my bad, I've cut&paste code while thinking of similar code.
Apr 26 2011