無制限のポリモーフィズムに基づいて、文字列をさまざまな種類のデータ型に変換できるルーチンを作成しようとしています。アイデアは、ユーザーがこのルーチンを呼び出し、データを格納する場所に変数を渡し、ルーチンが変数/引数の型に基づいて変換を定義することです。
このルーチンの抜粋は次のとおりです。
subroutine GetAsScalar (this, value, status)
!Arguments-------------------------------------------------------------
class(TKeyword) :: this
class(*) :: value
logical, optional :: status
!Local-----------------------------------------------------------------
integer :: stat
!----------------------------------------------------------------------
stat = 0
select type (value)
type is (REAL(real32)) !single precision
read (this%fValue, *, IOSTAT = stat) value
type is (REAL(real64)) !double precision
read (this%fValue, *, IOSTAT = stat) value
type is (LOGICAL)
read (this%fValue, *, IOSTAT = stat) value
type is (INTEGER(int32)) !integer
read (this%fValue, *, IOSTAT = stat) value
type is (INTEGER(int64)) !long integer
read (this%fValue, *, IOSTAT = stat) value
type is (CHARACTER(*))
value = this%fValue
class default
this%Message = "Invalid data type"
status = .false.
return
end select
if (present (status)) then
if (stat /= 0) then
status = .false.
else
status = .true.
endif
endif
end subroutine GetAsScalar
「this%fValue」は「character(len=:)、割り当て可能な」文字列です。割り当て可能な文字列を渡すこのルーチンを使用しようとすると、成功して終了し、エラー/例外は発生しません:
character(len=:), allocatable :: value
call keyword%GetAsScalar(value)
ただし、文字列「値」は常に空です。ルーチン内でも、"value = this%fValue" を割り当てた後、value は空 (len(value) は 0) です。
コンパイラは、引数が文字型 (len=:) であり、割り当て可能であることを検出できないため、値を割り当てることができないようです。
もちろん、いくつかの代替手段がありますが、単一のルーチンを使用でき、さまざまな種類のデータに対してオプションの引数を使用できないというアイデアは非常に優れています。
たとえば、文字列を処理するために作成したユーザー定義型を使用できます。
しかし、これが Fortran 2008 のデフォルトの動作であるかどうかを知りたいです。また、これを達成する方法があれば、このルーチンを単一の「class(*)」ダミー引数とともに使用して、割り当て可能な文字を参照しました。たとえば、ルーチン内で割り当てを強制する方法はありますか?
コメントをお待ちしております。乾杯、エドゥアルド