C++1y - 動的型によるスイッチ

N3449 Open and Efficient Type Switch for C++


HaskellOCamlにあるパターンマッチがC++にほしい、というお話。
以下のような動的に決定される型での条件分岐を綺麗に書きたいというのが基本的な動機です。

Base* x = new Derived();

// このように書きたい
switch (x) {
    case Base:
        ...
    case Derived:
        ...
}

これまでそのような分岐にはVisitorパターンや単純なdynamic_castなどが使われていて、C++の設計者であるBjarne Stroustrupは昔から「マルチメソッド(多重ディスパッチ)」という動的型による関数オーバーロードがほしいと言っていました。


このペーパーでは、パターンマッチをC++に導入する具体的な構文や仕様の提案ではなく、パフォーマンスの検証が行われています。


代数データ型やHaskellのGADTs、OCamlの多相ヴァリアントなどにも言及されているので、うまくいいとこ取りした仕様で入ってほしいですね。