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