読者です 読者をやめる 読者になる 読者になる

チェック付き間接参照の提案 またの名をパターンマッチ

C++

ポインタ操作では、以下のように「間接参照可能か(有効な値を指すポインタか)」をチェックしてから間接参照する、というのがよく行われます。

if (p) {
    T x = *p;
}

これを以下のように書けるようにしよう、というのがこの提案。

if (T x : p) {
}

つまり、間接参照ができるなら間接参照をして値を取り出す、までを一つのif文でやってしまおうというものです。

これは、値の判定と取り出しを同時に行う、ミニマムなパターンマッチと見なすことができます。

この機能は、多くの状況で便利に活用できます。

weak_ptrの場合

weak_ptrは、lock()メンバ関数を使用してshared_ptrオブジェクトを取り出します。その際、以下のようなコードを書くことになりますが、

if (shared_ptr<T> sp = wp.lock()) {
    f(*sp);
}

この状況で欲しいのはshared_ptrオブジェクトではなく、それを間接参照した要素ですので、今回提案されている構文を使えば、このようなコードがより簡潔に書けるようになります:

if (T& x : wp.lock()) {
    f(x);
}

while文の場合

有効な値を取り出せる間ループし続ける、という以下のようなコードも、

while (optional<message> m = try_read(i)) {
    process(*m);
}

この提案の構文をwhile文にも適用すれば、以下のように書けるようになります。

while (message m : try_read(i)) {
    process(m);
}

optionalは間接参照の演算子を持っているので、この構文が適用可能です。

この提案の今後

この提案の作者が、Clangで試しに実装してみるようです。今回の提案はだいぶ小さなものですが、非常に有用なものだと感じます。