演算子のオーバーロードについて
演算子のオーバーロードと構造体を使うことで新しい型などを作ることができるようになります。今回は演算子のExplicitとImplicitを使って文字列から数字にキャストする構造体と作ってみたいと思います。行う処理は変換関数をラップしているだけですが、見た目がカッコ良くなります。
通常、文字列からIntegerに変換する場合、
intg := StrToInt('218') ;
と書きますが、これが
intg := TCast('218') ;
と書けるように工夫してみます。また、演算子のオーバーロードを利用することで、Double型にも同じ形で使えるようにしたいと思います。
doub := TCast('3.14') ;
Explicitは明示的なキャストと言われ、所謂"()"を使ったキャストです。Implicitは暗黙的なキャストで代入処理で暗黙的に行われるキャストです。
TCastではExplicit演算子関数をあたかも(C言語でいう)コンストラクタに見えるよう使っています。
TCastを以下に示します。
TCast = record
private
pS : string ;
public
class operator Explicit(const v : string) : TCast ; inline ;
public
class operator Implicit(const v : TCast) : Integer ; inline ;
class operator Implicit(const v : TCast) : Extended ; inline ;
end;
class operator TCast.Explicit(const v: string): TCast;
begin
result.pS := v ;
end;
class operator TCast.Implicit(const v: TCast): Integer;
begin
inherited;
result := StrToInt(v.pS) ;
end;
class operator TCast.Implicit(const v: TCast): Extended;
begin
result := StrToFloat(v.pS) ;
end;
Implicitは":="の演算子関数で、複数宣言可能です(Explicitも複数宣言できます)A := TFoo.... (A:変数型)
の場合は
class operator TFoo.Implicit(const v: TFoo): A;
と書き、
TFoo... := A (A:変数型)
の場合は
class operator TFoo.Implicit(const v: A): TFoo;
と書きます。
これを使って戻り値のオーバーロードのようなものを実現します。引数のオーバーロードと同様、型は一致していないとデフォルトの関数が呼ばれるようなので注意が必要です。
次回はオーバーロードに関してもう少し考えてみます。
ソースコードは自由にご使用ください。ただし問題が起きても責任はとれません。
0 件のコメント:
コメントを投稿