Hi,

I created a custom type which enables me to have enums which have in their initial state, the init value of their base type. Something similiar to Nullable...

enum Reason : string {CO = "Co", FU = "Fu", CA = "Ca"}
struct TestStruct {InitialEnum!Reason reason;}

This line raises the error:
TestStruct s2 = TestStruct(Reason.FU);
Error: cannot implicitly convert expression ("Fu") of type Reason to InitialEnum!(Reason)

While this line is working fine:
TestStruct s1 = {reason: Reason.FU};

What do I miss?

Kind regards
André

struct InitialEnum(T)
{
        import std.traits: OriginalType, EnumMembers;
        import std.conv: to;
        
        private T _value;
        private bool _isEmpty = true;
        alias EnumBaseType = OriginalType!T;
        
@property EnumBaseType baseTypeValue() { return (_isEmpty) ? EnumBaseType.init : _value; }
        @property T value()     { return _value; }
        @property bool isEmpty() { return _isEmpty;     }
        
        alias baseTypeValue this;
        
        void opAssign(EnumBaseType value)
        {
                if (value == EnumBaseType.init)
                {
                        _isEmpty = true;
                        return;
                }
                
                foreach (member; EnumMembers!T)
                {
                        if (value == member)
                        {
                                _value = member;
                                _isEmpty = false;
                                return;
                        }               
                }
throw new Exception("Value "~value.to!string~" is not a valid enum value");
        }

        this(T t)
        {
                _isEmpty = false;
                _value = t;
        }
        
        this(EnumBaseType value)
        {
                opAssign(value);
        }
}

Reply via email to