- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Am trying to use select type and i have a parameterized data type.
I can't find whether it's possible to use the select type in order to do an upcasting.
And when i search in the standard i only find select type for derived type without parameters.
Thank you.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
@Hafsia, Aouididi,
With KIND type parameters you need to be explicit in terms of the kind and end up with TYPE IS (or CLASS IS) branches for each supported one; with LEN type parameters of parameterized types (PDTs) you can adopt the assumed length (=*) syntax just as with types of CHARACTER intrinsic or have branches for sets of supported specific lengths only.
A quick example:
module a
type :: a_t(X)
integer, kind :: X = 0
end type
end module
module e
use a, only : a_t
type, extends(a_t) :: e_t(Y)
integer, len :: Y = 0
end type
end module
use a, only : a_t
use e, only : e_t
blk1: block
class(a_t), allocatable :: foo
allocate ( a_t :: foo )
print *, "Block 1"
select type ( foo )
type is ( a_t(X=0) )
print *, "foo is of type a_t"
class default
end select
end block blk1
blk2: block
class(a_t), allocatable :: foo
allocate ( e_t :: foo )
print *, "Block 2"
select type ( foo )
type is ( e_t(X=0,Y=*) )
print *, "foo is of type e_t"
class default
end select
end block blk2
end
Upon execution, you should get:
Block 1 foo is of type a_t Block 2 foo is of type e_t
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
@Hafsia, Aouididi,
With KIND type parameters you need to be explicit in terms of the kind and end up with TYPE IS (or CLASS IS) branches for each supported one; with LEN type parameters of parameterized types (PDTs) you can adopt the assumed length (=*) syntax just as with types of CHARACTER intrinsic or have branches for sets of supported specific lengths only.
A quick example:
module a
type :: a_t(X)
integer, kind :: X = 0
end type
end module
module e
use a, only : a_t
type, extends(a_t) :: e_t(Y)
integer, len :: Y = 0
end type
end module
use a, only : a_t
use e, only : e_t
blk1: block
class(a_t), allocatable :: foo
allocate ( a_t :: foo )
print *, "Block 1"
select type ( foo )
type is ( a_t(X=0) )
print *, "foo is of type a_t"
class default
end select
end block blk1
blk2: block
class(a_t), allocatable :: foo
allocate ( e_t :: foo )
print *, "Block 2"
select type ( foo )
type is ( e_t(X=0,Y=*) )
print *, "foo is of type e_t"
class default
end select
end block blk2
end
Upon execution, you should get:
Block 1 foo is of type a_t Block 2 foo is of type e_t
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page