Использование Visual Studio 2015 и Intel Visual Fortran 2017.
Я не уверен, что это то, что вы можете сделать в Фортране или на любом другом языке, но похоже, что это может быть очень полезно для сокращения кода котельной плиты в моем проекте, если есть возможность сделать это или что-то еще. аналогичный. Я знаю, что могу просто не знать, что искать.
То, как я сейчас это делаю:
Module Example
Type SpecificType_T
real :: x
End Type SpecificType_T
Type, abstract :: List_A
class(*) :: obj
contains
procedure :: getObj => list_getSpecificType
End Type List_A
Type SpecificTypeCollection_T
contains
procedure :: getSpecificType => collection_getSpecificType
End Type SpecificTypeCollection_T
contains
subroutine list_getObj(this, obj)
class(List_A), intent(inout) :: this
class(*), intent(out) :: obj
allocate(obj, source=this%obj)
end subroutine list_getObj
function container_getSpecificType(this) result(st)
class(SpecificTypeCollection_T), intent(in) :: this
type(SpecificType_T) :: st
class(*), allocatable :: obj
select type(obj)
type is(SpecificType_T)
st = obj
end select
end function container_getSpecificType
End Module Example
Program test
use Example
type(SpecificType_T) :: a
type(SpecificTypeCollection_T) :: stc
a = stc%getSpecificType()
end Program test
Ниже приведен пример того, что я хочу сделать (хотя я знаю, что это недопустимый фортран). По сути, я просто хочу избежать необходимости оборачивать каждую функцию абстрактного типа табличкой котла для каждого унаследованного типа.
Module Example
Type SpecificType_T
real :: x
End Type SpecificType_T
Type, abstract :: List_A
class(*) :: obj
contains
procedure :: getObj => list_getSpecificType
End Type List_A
Type SpecificTypeCollection_T
class(SpecificType_T) :: obj
End Type SpecificTypeCollection_T
function list_getObj(this) result(obj)
class(List_A), intent(inout) :: this
class(*), intent(out) :: obj
allocate(obj, source=this%obj)
end function list_getObj
End Module Example
Program test
use Example
type(SpecificType_T) :: a
type(SpecificTypeCollection_T) :: stc
a = stc%getObj()
end Program test
РЕДАКТИРОВАТЬ (для пояснения): По сути, кажется, что было бы действительно удобно, если бы я мог создать некоторый абстрактный базовый объект с процедурами, подобными push
или pop
, которые воздействуют на неограниченное полиморфное поле также в абстрактном объекте, и затем иметь унаследованный тип, который может применять определенный производный тип без необходимости создавать оболочки в унаследованном объекте для всех процедур, изменяющих неограниченный полиморфный объект.
Это вещь, которую можно сделать в Фортране, или есть другая жизнеспособная альтернатива, о которой я не знаю?