一方

しつこく例外バージョンについても考えてみる。
例外全部拾っちゃうのはどう考えても危ないので、
例外ヒエラルキーを再編成して

        class demivalue;

        template < class T >
        class concrete_demivalue<T> : public demivalue {}

として

        A ||-> B

        try {
            eval A;
        }
        catch(demivalue&){
            eval B;
        }

と展開するとすれば

        f() ||-> g()

と書くときに

        Foo* f()
        {
            if( bad ) throw concrete_demivalue<NotFound>;
            return new Foo;
        }

のようなことをしてライブラリ側で意図を示すことができ、
呼び出し側でその意図を汲むことも無視することもできる。


上のoption/tupleにしても、
この例外の種類で判別する方法にしても、
どこかで思想が入るのは避けられないが。
あとC++的には言語機能とライブラリ機能が
ごっちゃになってしまっているので
ありえなさそう。


一番機械的なのは、呼び出される側はとにかく全部例外にして、
受ける側で

        f() ||->(NotFound) g()

みたいに明示することだと思うが、書くのめんどくさくてやだな。