Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
March 31, 2007 Address of instance member function | ||||
---|---|---|---|---|
| ||||
What is the meaning of the value returned by the address operator applied to an instance member function as if that function were static? class Foo { void bar() { } } void main() { writefln(&Foo.bar); } |
March 31, 2007 Re: Address of instance member function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Max Samukha | "Max Samukha" <samukha@voliacable.com> wrote in message news:11js039sich4vjo364at18so5m625bdvc8@4ax.com... > What is the meaning of the value returned by the address operator applied to an instance member function as if that function were static? > > class Foo > { > void bar() > { > } > } > > void main() > { > writefln(&Foo.bar); > } It's a function pointer to that method. It's actually useful -- you can simulate pointer-to-members using this and delegates: class A { int mX; this(int x) { mX = x; } void foo(int y) { writefln(mX, ", ", y); } } void main() { scope a = new A(5); a.foo(4); void delegate(int) dg; dg.funcptr = &A.foo; // <<- dah dg.ptr = cast(void*)a; dg(8); } |
March 31, 2007 Re: Address of instance member function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | On Sat, 31 Mar 2007 11:43:47 -0400, "Jarrett Billingsley" <kb3ctd2@yahoo.com> wrote:
>"Max Samukha" <samukha@voliacable.com> wrote in message news:11js039sich4vjo364at18so5m625bdvc8@4ax.com...
>> What is the meaning of the value returned by the address operator applied to an instance member function as if that function were static?
>>
>> class Foo
>> {
>> void bar()
>> {
>> }
>> }
>>
>> void main()
>> {
>> writefln(&Foo.bar);
>> }
>
>It's a function pointer to that method. It's actually useful -- you can simulate pointer-to-members using this and delegates:
>
>class A
>{
> int mX;
>
> this(int x)
> {
> mX = x;
> }
>
> void foo(int y)
> {
> writefln(mX, ", ", y);
> }
>}
>
>void main()
>{
> scope a = new A(5);
> a.foo(4);
>
> void delegate(int) dg;
> dg.funcptr = &A.foo; // <<- dah
> dg.ptr = cast(void*)a;
> dg(8);
>}
>
>
Thanks a lot. That's exactly what I need
|
March 31, 2007 Re: Address of instance member function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | Jarrett Billingsley wrote: > It's a function pointer to that method. It's actually useful -- you can > simulate pointer-to-members using this and delegates: > > class A > { > int mX; > > this(int x) > { > mX = x; > } > > void foo(int y) > { > writefln(mX, ", ", y); > } > } > > void main() > { > scope a = new A(5); > a.foo(4); > > void delegate(int) dg; > dg.funcptr = &A.foo; // <<- dah > dg.ptr = cast(void*)a; Are there other uses? Doesn't the above essentially boil down to just: auto dg = &a.foo; > dg(8); > } > -- Remove ".doesnotlike.spam" from the mail address. |
March 31, 2007 Re: Address of instance member function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Deewiant | Deewiant wrote:
> Jarrett Billingsley wrote:
> > It's a function pointer to that method. It's actually useful -- you can
>> simulate pointer-to-members using this and delegates:
>>
>> class A
>> {
>> int mX;
>>
>> this(int x)
>> {
>> mX = x;
>> }
>>
>> void foo(int y)
>> {
>> writefln(mX, ", ", y);
>> }
>> }
>>
>> void main()
>> {
>> scope a = new A(5);
>> a.foo(4);
>>
>> void delegate(int) dg;
>> dg.funcptr = &A.foo; // <<- dah
>> dg.ptr = cast(void*)a;
>
> Are there other uses? Doesn't the above essentially boil down to just:
>
> auto dg = &a.foo;
>
It does, except that you could later set dg.ptr to a /different/ instance. Its utility is in late binding to instances selected by some arbitrary (and possibly external) means. I'd like to see if it plays well with inheritance, though.
-- Chris Nicholson-Sauls
|
March 31, 2007 Re: Address of instance member function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Nicholson-Sauls | Chris Nicholson-Sauls wrote: > Deewiant wrote: > >> Jarrett Billingsley wrote: >> > It's a function pointer to that method. It's actually useful -- you can >> >>> simulate pointer-to-members using this and delegates: >>> >>> class A >>> { >>> int mX; >>> >>> this(int x) >>> { >>> mX = x; >>> } >>> >>> void foo(int y) >>> { >>> writefln(mX, ", ", y); >>> } >>> } >>> >>> void main() >>> { >>> scope a = new A(5); >>> a.foo(4); >>> >>> void delegate(int) dg; >>> dg.funcptr = &A.foo; // <<- dah >>> dg.ptr = cast(void*)a; >> >> >> Are there other uses? Doesn't the above essentially boil down to just: >> >> auto dg = &a.foo; >> > > It does, except that you could later set dg.ptr to a /different/ instance. Its utility is in late binding to instances selected by some arbitrary (and possibly external) means. I'd like to see if it plays well with inheritance, though. > > -- Chris Nicholson-Sauls It doesn't, really. class Base { void foo() { writefln("Base"); } } class Derived : Base { void foo() { writefln("Derived"); } } void main() { void delegate() dg; dg.funcptr = &Base.foo; dg.ptr = new Derived; dg(); // will print "Base" } However, this is precisely the behavior I would expect, and in fact Pyd relies on it. -- Kirk McDonald http://kirkmcdonald.blogspot.com Pyd: Connecting D and Python http://pyd.dsource.org |
Copyright © 1999-2021 by the D Language Foundation