Указатели на функцию приведения, возвращающие производные типы в Fortran2018 - PullRequest
0 голосов
/ 29 марта 2020

Вот пример.

module example

  type scheme_object
  end type scheme_object

  type, extends( scheme_object ) :: scheme_primitive_procedure
     procedure(packageable_function), pointer, nopass :: proc_pointer
  end type scheme_primitive_procedure
  abstract interface
     function packageable_function() result( retval )
       import :: scheme_object
       class(scheme_object), pointer :: retval
     end function packageable_function
  end interface

contains

  recursive function make_primitive_procedure_object() result( retval_pointer )
    type(scheme_primitive_procedure), pointer :: retval
    class(scheme_object), pointer :: retval_pointer
    allocate( scheme_primitive_procedure :: retval )
    retval%proc_pointer => make_primitive_procedure_object
    retval_pointer => retval
  end function make_primitive_procedure_object

end module example

MWE немного усложняется во имя сокращения кода. Проще говоря, экземпляр sche_primitive_procedure должен инкапсулировать функции, возвращающие различные подтипы schema_object.

В make_primitive_procedure_object тип результата является подтипом circuit_object, представляющим функции, возвращающие объекты схемы.

Что не так с этим кодом? Проблема в том, что я действительно не хочу только_ возвращать классы (schema_object) из моих процедур. Я хочу, чтобы мои процедуры возвращали указатели на различные подтипы schema_object без явного приведения вверх.

Возможно ли это?

1 Ответ

0 голосов
/ 01 апреля 2020

Если объект указателя процедуры имеет явный интерфейс (который требуется для объектов указателя процедуры, которые имеют полиморфные аргументы c, среди прочего - F2018 15.4.2.2p1), тогда характеристики целевой процедуры должны совпадать ( бар чистота) - 10.2.2.4p3). Характеристики процедуры, являющейся функцией, включают в себя объявленный тип результата функции (15.3.1p1 / 15.3.3p1).

Объявленный тип результата функции процедуры должен соответствовать объявленному типу функции. результат функции указателя процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...