alias this

aliasthisのキーワードの個々の意味は、前の章で説明した。これらの2つのキーワードは、alias thisとして一緒に使用されると、完全に異なる意味を持つ。

alias thisは、ユーザー定義型の自動型変換(暗黙の型変換とも呼ばれる)有効にする。演算子オーバーロードの章で見たように、型に型変換を提供する別の方法は、その型に対してopCastを定義することだ。違いは、opCastは明示的な型変換用であるのに対し、alias thisは自動型変換用であることだ。

キーワードaliasthisは、メンバー変数またはメンバー関数の名前がそれらの間に指定されている場合に、別々に記述される。

alias member_variable_or_member_function this;
D

alias thisは、ユーザー定義型からそのメンバーの型への特定の変換を有効にする。メンバーの値は、変換の結果の値になる。

次のFractionの例では、メンバー関数で alias thisを使用している。さらに下のTeachingAssistantの例では、メンバー変数で使用している。

以下のvalue()の戻り値の型はdoubleであるため、次のalias thisにより、Fractionオブジェクトがdouble値に自動的に変換される。

import std.stdio;

struct Fraction {
    long numerator;
    long denominator;

    double value() const {
        return double(numerator) / denominator;
    }

    alias value this;

    // ...
}

double calculate(double lhs, double rhs) {
    return 2 * lhs + rhs;
}

void main() {
    auto fraction = Fraction(1, 4);    // 意味は1/4
    writeln(calculate(fraction, 0.75));
}
D
alias_this.1

value()が自動的に呼び出され、double値が期待される場所にFractionオブジェクトが現れると、double値が生成される。そのため、変数fractioncalculate()の引数として渡すことができる。value()は1/4の値として0.25を返し、プログラムは2 * 0.25 + 0.75の結果を出力する。

1.25