1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
module operator_overloading_16_mod
implicit none
type, abstract :: base
contains
procedure(is_equal_ifc), deferred :: is_equal
generic :: operator(==) => is_equal
end type base
abstract interface
logical function is_equal_ifc(a, b)
import :: base
class(base), intent(in) :: a, b
end function is_equal_ifc
end interface
type, extends(base) :: derived_1
integer :: val
character(len=:), allocatable :: str
contains
procedure :: is_equal => d1_equal
end type derived_1
contains
logical function d1_equal(a, b)
class(derived_1), intent(in) :: a
class(base), intent(in) :: b
select type(b)
type is (derived_1)
d1_equal = a%val == b%val
class default
d1_equal = .false.
end select
end function d1_equal
end module operator_overloading_16_mod
program operator_overloading_16
use operator_overloading_16_mod
implicit none
type(derived_1) :: x, y
logical :: res
x%val = 42
y%val = 41
x%str = "Hello"
y%str = "World"
res = x == y
if (res) error stop
y%str = "Hello"
y%val = 42
res = x == y
if (.not. res) error stop
end program operator_overloading_16
|