function pointer as the enum base type

Jarrett Billingsley jarrett.billingsley at gmail.com
Sun Oct 5 16:33:05 PDT 2008


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;


More information about the Digitalmars-d-learn mailing list