2017-01-06 2 views
0

Я пытаюсь понять, почему одно из ниже разрешено стандартом, а другое - нет. Они не кажутся разными, за исключением кода шаблона для меня. Я чувствую, что я что-то недопонимаю, или что есть лучший способ сделать это. Любая помощь будет оценена по достоинству.Возвращающийся полиморфный класс

Не допускается:

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 

ответ

1

Текущий стандарт позволяет одновременно.

«Разрешенный» кодовый блок имеет функцию с не полиморфным результатом, с результатом оценки функции, назначенной неполиморфной переменной. Это действительный Fortran 2003.

Блок «недопустимый» имеет функцию с полиморфным результатом с результатом оценки функции, назначенной полиморфной переменной. Это верно. Fortran 2008.

Обратите внимание, что число полных реализаций компилятора Fortran 2008 там невелико.

~~~

Функция в «не допускается» блок несколько бессмысленно - блок код эквивалентен:

real :: x 
class(*) :: temp 

x = 4 

temp = x 

select type(temp) 
type is(real) 
    write(*,*) temp 
end select 
+0

Спасибо за информацию о Fortran 2008. Мой компилятор не есть эта особенность, но тогда, но приятно знать, что это на пути в конце концов. Весь фрагмент кода в приведенном выше примере бессмысленен, поскольку он делает что-то полезное. Это был простой пример, чтобы проиллюстрировать мой вопрос. Полезной версией функции будет выполнение некоторой большой модификации части родительского класса множества дочерних типов. –

+0

Например, я имею дело с множеством различных координат. У меня есть родительский тип (положение, скорость и ускорение), но я решил дать каждому кадру координат свой собственный дочерний тип, чтобы удалить возможность передачи неправильного фрейма в функцию преобразования координат, а также дать каждому ребенку способность удерживать соответствующие справочные данные. У меня есть функция, которая принимает правую рамку и возвращает левую. Я предпочел бы иметь только одну копию функции для всех детей. Это не представляется возможным в fortran, без лишних накладных расходов. –

+0

Aaaaaaand .... Я просто понял, как сделать свой пример в приведенном выше комментарии. После гораздо дольше, чем я хотел бы признать, я понял, что могу просто использовать дочерний элемент% parent = parentModifyingFunction(), и мне не нужно заботиться о работе для возвращения полиморфного класса для многих случаев. –

Смежные вопросы