2017-01-06 6 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 ....私はちょうど上記のコメントで私の例を行う方法を考え出した。私が認めることよりはるかに長い時間が経過した後、私はchild%parent = parentModifyingFunction()を使うことができ、多くの場合、ポリモーフィックなクラスを返すための工夫を気にする必要はありません。 –