function pointer as the enum base type

Denis Koroskin 2korden at gmail.com
Sun Oct 5 16:41:11 PDT 2008


On Mon, 06 Oct 2008 03:33:05 +0400, Jarrett Billingsley  
<jarrett.billingsley at gmail.com> wrote:

> On Sun, Oct 5, 2008 at 7:26 PM, Denis Koroskin <2korden at gmail.com> wrote:
>> On Mon, 06 Oct 2008 03:21:09 +0400, mumba <qniol at o2.pl> wrote:
>>
>>> Idea: to make an enum type with function pointers as it's elements.
>>> Problem: no more than one element can be inserted!
>>>
>>> $echo '
>>> void foo() {}
>>> void bar() {}
>>>
>>> enum Enum : void function() {
>>>    FOO = &foo,
>>>    BAR = &bar
>>> }
>>>
>>> int main() { return 0;  }' > enum.d
>>> $dmd --help
>>> Digital Mars D Compiler v2.014
>>> Copyright (c) 1999-2008 by Digital Mars written by Walter Bright
>>> Documentation: http://www.digitalmars.com/d/2.0/index.html
>>> ...
>>> $dmd enum.d
>>> enum.d(5): Error: Integer constant expression expected instead of (&  
>>> bar)
>>> < (& foo)
>>> enum.d(5): Error: Integer constant expression expected instead of (&  
>>> bar)
>>> > (& foo)
>>>
>>>
>>> I don't understand the error message.
>>> First - why integer constant expression expected, if it's supposed to  
>>> be
>>> the function based enum? Second - instead of what? (& bar) expression,  
>>> which
>>> is smaller than (& foo), or boolean expression (& bar) < (& foo)?
>>> Third - in both cases: if only one of these messages appeard - it  
>>> would be
>>> just strange for me. But as they are together and both refer to the  
>>> same
>>> line - I'm knocked out. What logic leads to such mutually exclusive  
>>> pieces
>>> of information?
>>>
>>> Please someone explain it to me.
>>>
>>> By the way:
>>>
>>> enum Enum : void function() {
>>>    FOO = &foo
>>> }
>>>
>>> works fine.
>>>
>>>
>>> cheers
>>>
>>
>>
>> Looks like it can't sort the enum values at compile time. That's because
>> &foo and &bar are not known until codegen phase.
>>
>
> Nothing of the sort.  Enums must derive from an integer or boolean
> type, which function pointers certainly are not.  It's perfectly fine
> to say:
>
> const FOO = &foo;

Yeah, of course. But why the following works?

import std.stdio;

int foo() { return 42; }

enum Enum : int function() {
     FOO = &foo,
//  BAR = &foo    // uncomment the line and it stops working
}

int main()
{
	writefln(Enum.FOO());
	return 0;
}


More information about the Digitalmars-d-learn mailing list