N2179: Language Support for Transporting Exceptions between Threads
よく見たらC++0xのドラフトにはN2179で提案された例外の転送機能が含まれていたので、実装してみました。
今日の差分
とりあえずVC++だけ対応です。まだ、一部多重例外になる箇所が残っています。
こんな感じに使えます。
#include <hamigaki/exception.hpp> struct my_exception{}; int main() { hamigaki::exception_ptr p; try { throw my_exception(); } catch (...) { // 捕捉中の例外を保管する p = hamigaki::current_exception(); } // 上と同じ意味 p = hamigaki::copy_exception(my_exception()); try { // 保管しておいた例外を送出する hamigaki::rethrow_exception(p); } catch (const my_exception&) { // ここで捕捉される } }
g++での実装もやってみますが、g++だとコピーでなく移動になるので完全には実装できないと思います。