www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Address of instance member function

reply Max Samukha <samukha voliacable.com> writes:
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);		
}
Mar 31 2007
parent reply "Jarrett Billingsley" <kb3ctd2 yahoo.com> writes:
"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); }
Mar 31 2007
next sibling parent Max Samukha <samukha voliacable.com> writes:
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); }

Mar 31 2007
prev sibling parent reply Deewiant <deewiant.doesnotlike.spam gmail.com> writes:
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.
Mar 31 2007
parent reply Chris Nicholson-Sauls <ibisbasenji gmail.com> writes:
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
Mar 30 2007
parent Kirk McDonald <kirklin.mcdonald gmail.com> writes:
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
Mar 31 2007