boost::outcome::result
ここ最近仕事で C++ を書くことになってそこで困った話。
経緯として、C++ で例外を投げたくないので関数型言語の Either みたいな直和型が欲しいとぼやいていたら、
https://twitter.com/cpp_akira さんから boost::outcome
というのがあると教えていただいた。
これは良さそう!ということで早速試してみたのだが、ドキュメントを見ながらコードに落としてみてもどうにもビルドできない。 ドキュメントにあるコードをビルドしてみても同じようなエラーになってしまう。
prog.cc:68:12: error: no viable conversion from returned value of type 'ConversionErrc' to function return type 'outcome::result<int>' (aka 'basic_result<int, boost::system::error_code, boost::outcome_v2::policy::error_code_throw_as_system_error<int, boost::system::error_code, void> >') return ConversionErrc::EmptyString;
ドキュメントにあったとおりオレオレエラーコードの std::error_code
への変換を行う処理も書いたのになんで?と一晩ぐらい悩んだ。
で、ふと boost には boost::systemm::error_code
というのがあるのを知ったので、もしかしてと思いオレオレエラーコードの変換先をこちらにしてみた。
やはりというかそれで動いてしまった。
おそらくドキュメントがoutcome
のboost
入り前で更新が止まっているらしく、std::error_code
とある部分は boost::system::error_code
に読み替えないといけないらしい。
ということでなんとか解決はできたが疑問が残る。仕事で C++ を使うのはこれが初めてなんだが、Boostライブラリの使用時には std
にあるものよりも boost
にあるものを優先して使うのがお約束だったりするんだろうか?そうでもないと自分と同じ問題にあたっている人が全然いないように思える。