一方
しつこく例外バージョンについても考えてみる。
例外全部拾っちゃうのはどう考えても危ないので、
例外ヒエラルキーを再編成して
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()
みたいに明示することだと思うが、書くのめんどくさくてやだな。