Я пытаюсь понять, почему одно из ниже разрешено стандартом, а другое - нет. Они не кажутся разными, за исключением кода шаблона для меня. Я чувствую, что я что-то недопонимаю, или что есть лучший способ сделать это. Любая помощь будет оценена по достоинству.Возвращающийся полиморфный класс
Не допускается:
real :: x
class(*) :: temp
x = 4
temp = genericAssignment(x)
select type(temp)
type is(real)
write(*,*) temp
end select
contains
function genericAssignment(a) result(b)
class(*) :: a
class(*) :: b
allocate(b, source=a)
end function genericAssignment
Разрешено:
Type GenericContainer
class(*), pointer :: gen
End Type
real :: x
class(*) :: ptr
type(GenericContainer) :: temp
x = 4
temp = genericAssignment(x)
select type(ptr => temp%gen)
type is(real)
write(*,*) ptr
end select
contains
function genericAssignment(a) result(b)
class(*) :: a
type(GenericContainer) :: b
allocate(b%gen, source=a)
end function genericAssignment
Спасибо за информацию о Fortran 2008. Мой компилятор не есть эта особенность, но тогда, но приятно знать, что это на пути в конце концов. Весь фрагмент кода в приведенном выше примере бессмысленен, поскольку он делает что-то полезное. Это был простой пример, чтобы проиллюстрировать мой вопрос. Полезной версией функции будет выполнение некоторой большой модификации части родительского класса множества дочерних типов. –
Например, я имею дело с множеством различных координат. У меня есть родительский тип (положение, скорость и ускорение), но я решил дать каждому кадру координат свой собственный дочерний тип, чтобы удалить возможность передачи неправильного фрейма в функцию преобразования координат, а также дать каждому ребенку способность удерживать соответствующие справочные данные. У меня есть функция, которая принимает правую рамку и возвращает левую. Я предпочел бы иметь только одну копию функции для всех детей. Это не представляется возможным в fortran, без лишних накладных расходов. –
Aaaaaaand .... Я просто понял, как сделать свой пример в приведенном выше комментарии. После гораздо дольше, чем я хотел бы признать, я понял, что могу просто использовать дочерний элемент% parent = parentModifyingFunction(), и мне не нужно заботиться о работе для возвращения полиморфного класса для многих случаев. –