Класс Enum в Фортране

Я пытался реализовать что-то вроде C ++ enum class в Фортране. Это означает, что он должен быть типизированным и ограниченным по области видимости. (Например, нет сравнения между целыми числами и значениями перечисления.)

Следующие работы работают, но все еще можно сравнить два экземпляра разных enum classes во время компиляции. Есть ли у вас предложения по поводу возможных улучшений?

module enum_class_mod
    implicit none(type, external)
    private
    public :: EnumBase_t

    type, abstract :: EnumBase_t
        integer :: val
    contains
        private
        procedure :: eq_EnumBase_t
        procedure :: neq_EnumBase_t
        generic, public :: operator(==) => eq_EnumBase_t
        generic, public :: operator(/=) => neq_EnumBase_t
    end type


contains

    logical elemental function eq_EnumBase_t(this, other)
        class(EnumBase_t), intent(in) :: this, other
        if (.not. SAME_TYPE_AS(this, other)) error stop 'Can only compare objects of same type'
        eq_EnumBase_t = this%val == other%val
    end function

    logical elemental function neq_EnumBase_t(this, other)
        class(EnumBase_t), intent(in) :: this, other
        if (.not. SAME_TYPE_AS(this, other)) error stop 'Can only compare objects of same type'
        neq_EnumBase_t = this%val /= other%val
    end function
end module

program test_enum_class
    use enum_class_mod, only: EnumBase_t
    implicit none(type, external)

    type, extends(EnumBase_t) :: Color_t
    end type

    type :: PossibleColors_t
        type(Color_t) :: Red = Color_t(1), Blue = Color_t(2)
    end type

    type(PossibleColors_t), parameter :: possible_colors = PossibleColors_t()

    type, extends(EnumBase_t) :: Day_t
    end type

    type :: PossibleDays_t
        type(Day_t) :: Monday = Day_t(1), Tuesday = Day_t(2)
    end type

    type(PossibleDays_t), parameter :: possible_days = PossibleDays_t()


    write(*, *) possible_colors%Red == possible_colors%Blue
    write(*, *) possible_colors%Red == possible_colors%Red

    write(*, *) possible_days%Monday == possible_days%Tuesday

    ! fails at runtime, I would like it to fail at compile time
    write(*, *) possible_days%Monday == possible_colors%Red
end program

```

0

Добавить комментарий

Ваш адрес email не будет опубликован.