boost::optionalのドキュメントで,optionalな戻り値にpair<T, bool>を使うことに対して,
However, not only is this quite a burden syntactically, it is also error prone since the user can easily use the function result (first element of the pair) without ever checking if it has a valid value.
しかし、この方法は、書くのが大変なだけでなく、エラーの可能性が潜んでいる。関数の結果(pairの最初の要素)を、有効な値が入っているかどうかチェックせずに、たやすく参照できてしまう。
って書いてあってこれは非常に納得なんですが,一方で最近boolがfalseであってもTの値を参照できることに意味がある場合が存在することに気が付いて,この場合にはpair<T, bool>が恐らくベストになるんじゃないかなと思ったりするのです.
std::set<int> s; std::set<int>::iterator it; bool b; boost::tie(it, b) = s.insert(1); // 戻り値はstd::pair<iterator, bool> assert(b); // bはtrue std::cout << *it << std::endl // もちろんitを参照してよし boost::tie(it, b) = s.insert(1); // sにはすでに1がある assert(!b); // bはfalse std::cout << *it << std::endl; // しかしながらitを参照することに不整合は無い.というか参照できることが重要
ちなみにこういう戻り値に対しては上のようにboost::tieを使うと非常に(゜д゜)ウマー.
どうでも良い小ネタですた.
#というか,こういうセマンティクスを持つ戻り値はそもそもoptionalだとは言わないか・・・