Thread overview
array of functions
Jun 04, 2009
Trass3r
Jun 04, 2009
Trass3r
Jun 05, 2009
Robert Clipsham
June 04, 2009
I tried to use a function lookup table to quickly access a particular one.
But the compiler (dmd1) complains about
Error: non-constant expression & func

I guess because it's used inside a class since &func is of type function, not delegate?


Here's a stripped down example:

protected Object function(int)[] lookup = [
	&func
];

protected Object func(int)
{
	return null;
}
June 04, 2009
On Thu, Jun 4, 2009 at 12:42 PM, Trass3r <mrmocool@gmx.de> wrote:
> I tried to use a function lookup table to quickly access a particular one.
> But the compiler (dmd1) complains about
> Error: non-constant expression & func
>
> I guess because it's used inside a class since &func is of type function, not delegate?

You've got it the other way around.  If func is an instance method (non-static method) of a class, &func is a delegate, not a function.

It can't evaluate &func at compile-time because there is no way to create a delegate at compile-time.  You need an instance to create a delegate, which you can only create by using 'new', which only works at runtime.
June 04, 2009
Jarrett Billingsley schrieb:
> On Thu, Jun 4, 2009 at 12:42 PM, Trass3r <mrmocool@gmx.de> wrote:
>> I tried to use a function lookup table to quickly access a particular one.
>> But the compiler (dmd1) complains about
>> Error: non-constant expression & func
>>
>> I guess because it's used inside a class since &func is of type function,
>> not delegate?
> 
> You've got it the other way around.  If func is an instance method
> (non-static method) of a class, &func is a delegate, not a function.
> 

I know, but if I change that array to delegates, dmd complains:
Error: cannot implicitly convert expression (&func) of type Object function(int) to Object delegate(int)


> It can't evaluate &func at compile-time because there is no way to
> create a delegate at compile-time.
>

Yeah, gotta use a different approach.
June 05, 2009
Jarrett Billingsley wrote
> It can't evaluate &func at compile-time because there is no way to
> create a delegate at compile-time.

I believe that LDC used to support this, but had to remove the functionality due to some bugs with it/to be compatible with dmd.