boost::optional<T&>の話

コンストラクタで取る変数の受け取り方について、から始まって、 std::unique_ptr<T>&→T&→(T*)→boost::optional<T&>→boost::optional<T&>の改良版実装 etude::optional_ref<T> というような流れで話は進んでます。 続きを読む
11
普通のC++使い、銀天すばる @SubaruG

boost::optional<T&>「じゃないとダメ」って局面はめったにないけど、気軽に使えると嬉しいのは確か。

2011-02-15 00:11:48
@rshhh

@SubaruG boost::optional<T&> かー。なるほど。これはそういう場面ではよく使われてる手段なんですか?(何となく、最後の手段的な臭いがする気がするw

2011-02-15 00:20:17
普通のC++使い、銀天すばる @SubaruG

@rshhh 字面の通りです。無効値を取るかもしれない参照。便利ですよー。

2011-02-15 00:23:12
普通のC++使い、銀天すばる @SubaruG

@rshhh 例えば、あるコンテナの中から、ある要素を検索したい。でもその要素があるかどうかは実際に検索してみないと分からない。そういう場合に使うものです。

2011-02-15 00:24:12
@rshhh

@SubaruG なるほどなるほど。そういう場面にはかなり遭遇した記憶があるんですけど、多分生ポインタで対処していました。便利ですねぇ

2011-02-15 00:30:12
普通のC++使い、銀天すばる @SubaruG

@rshhh ただし弱点があって、実質的に生ポインタであるにもかかわらず、生ポインタよりメモリサイズも実行時コストも大きいという…。

2011-02-15 00:31:21
普通のC++使い、銀天すばる @SubaruG

@rshhh 意図は明確になるし、 & 演算子が多重定義されてても使えるし、うっかり delete とかも有り得ないので、コストが気にならなければ普通に便利に使えます。コストが上乗せっていっても、動的メモリ確保するとかじゃないので誤差の範囲ですしね。

2011-02-15 00:32:34
@rshhh

@SubaruG その程度のコストであればそれほど気にすることもないですよね。(コード次第でしょうけど)生ポインタを使うより遥かに安全ですしねぇ

2011-02-15 00:40:36
普通のC++使い、銀天すばる @SubaruG

@rshhh ですです。ただ、これは本来は省けるコストなので、参照の場合に最適化されてないのはちょっと残念なんですよね。だから標準に入って欲しかったなぁ、標準なら効率も気にするだろうし、というのが本音です。

2011-02-15 00:42:32
@rshhh

@SubaruG 「本来は省ける」のをわかった上で割りきって使うのなら、便利で安全だし生ポインタで生じるリスクとかも無い、と。標準に入って最適化がかかるっていうのを期待するのはちょっと違うかなぁとも思いますが、根本的な解決法がまだないあたり、それが現状でのベストなんでしょうね・・

2011-02-15 00:49:15
普通のC++使い、銀天すばる @SubaruG

@rshhh 根本的な解決はありますよ。 Boost にパッチを送ればいいのです。誰も面倒がってやってないだけで、解決事態は簡単なので。

2011-02-15 00:50:19
普通のC++使い、銀天すばる @SubaruG

@rshhh http://bit.ly/9MSBt3 これですね。なんで僕がパッチを送らないかというと、 Boost.Optional って古いコンパイラの対応がきっちりしてるライブラリなので、その辺に対応するのが面倒だという。

2011-02-15 00:52:23
@rshhh

@SubaruG エントリのコメント欄とgistのソース含め全部読みました。これ、この後どうなったのかが非常に気になるw 個人的には、これはこれで別のクラスとして作りこんでいく方向に賛成ですが。

2011-02-15 01:05:22
普通のC++使い、銀天すばる @SubaruG

@rshhh C++0x対応をしなければ、これはこれで既に完成されてるので、僕としてはバグが見つからない限りは特に直すつもりはないですね。

2011-02-15 01:09:41
@rshhh

@SubaruG ちょっと言い方が適切じゃなかったです。私としては、「別のクラスとして提供する」のに賛成、ですね。

2011-02-15 01:19:31
普通のC++使い、銀天すばる @SubaruG

@rshhh はい、ですので、別クラスとして既に完成されてるので、僕としては特に直すつもりもないです。

2011-02-15 01:20:22
@rshhh

@SubaruG ところで、(分かっている前提で話をしていた所申し訳ないんですが)optionalは構築されたかどうかを保持する変数があるのに対して、これは内部ではboost::addressofでアドレスを取って保持しているだけなのでそこが無い、っていう認識で大丈夫でしょうか。

2011-02-15 01:23:16
普通のC++使い、銀天すばる @SubaruG

@rshhh はい。 well-defined なプログラムでは、 NULL に対する参照というのは存在しないので、無効値は NULL ポインタを使って表しています。

2011-02-15 01:24:42
普通のC++使い、銀天すばる @SubaruG

@rshhh あともう一つ、 boost::optional<T&> はデストラクタがユーザ定義されているので、色々とコンパイラの最適化を阻害するんですよね。その点も改善点なので、デストラクタは定義してありません。

2011-02-15 01:25:49
@rshhh

@SubaruG なるほど。そこら辺も考えると、やはりこれはこれで別のものとして提供する方がいいですよね・・・。面白い話ができて楽しかったですw

2011-02-15 01:40:05