giantneco’s blog

技術メモ

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 というのがあるのを知ったので、もしかしてと思いオレオレエラーコードの変換先をこちらにしてみた。 やはりというかそれで動いてしまった。

おそらくドキュメントがoutcomeboost入り前で更新が止まっているらしく、std::error_code とある部分は boost::system::error_code に読み替えないといけないらしい。

ということでなんとか解決はできたが疑問が残る。仕事で C++ を使うのはこれが初めてなんだが、Boostライブラリの使用時には std にあるものよりも boost にあるものを優先して使うのがお約束だったりするんだろうか?そうでもないと自分と同じ問題にあたっている人が全然いないように思える。