function pointer as the enum base type
Robert Fraser
fraserofthenight at gmail.com
Sun Oct 5 21:29:07 PDT 2008
Denis Koroskin wrote:
> 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;
> }
I would call that a "bug".
More information about the Digitalmars-d-learn
mailing list