getかvalueか

std::optionalが提案された最初の時期、中身のデータを取り出す方法が、間接参照演算子しかありませんでした。そのあと、私が「boost::optionalにはget()メンバ関数があるが、こちらにはない。私はポインタインタフェースよりは、そちらを使いたい。」と提案したところ、get()メンバ関数の代わりに、value()メンバ関数が入りました。

その経緯としてはこういうものです。

  • shared_ptrunique_ptrには、生ポインタを取得するためのget()メンバ関数がある。
  • optionalは、見ようによってはスマートポインタと見なすこともできる。
  • optionalget()メンバ関数を入れるのであれば、スマートポインタのように、ポインタを返すべきではないか。
  • optionalget()はスマートポインタのインタフェースではなく、生データ(raw data, base data)を参照するセマンティクスなので、別名としてvalue()にしよう。

この結論を悪いとは思いませんが、私個人は、optionalboost::initializedstd::chrono::durationのようなラッパー型の、生データを参照するインタフェースを共通化したいと考えるので、私が作るクラスでは、get()メンバ関数に統一をしています。

先日の「チェック付き間接参照の提案 またの名をパターンマッチ」が受け入れられる場合は、生データを参照するインタフェースが共通していたほうがいいでしょうから、そのような話になったら、optionalのインタフェースも見直しになるかもしれません。間接参照演算子を共通インタフェースにはしたくないけどポインタも扱えるようにしたい、というなら、traitsのような中間インタフェースを用意することになるとは思います。

参照