これは、主にパックされた表現がブール値へのポインタを返すことを妨げるため、標準のコンテナ要件を満たさないことはよく知られています。std::vector<bool>
T* x = &v[i]
私の質問は、reference_proxyがaddress-ofをオーバーロードしoperator&
てpointer_proxyを返すときに、これを修正/軽減できるかどうかです。
ポインタプロキシには、ほとんどの実装でreference_proxyと同じデータ、つまり、パックされたデータへのポインタと、ポイントされたブロック内の特定のビットを分離するためのマスクを含めることができます。次に、pointer_proxyを間接参照すると、reference_proxyが生成されます。基本的に、両方のプロキシは「ファット」ポインタですが、ディスクベースのプロキシコンテナと比較すると、依然としてかなり軽量です。
代わりに、T* x = &v[0]
を実行してauto x = &v[0]
、問題なく使用できx
ますif(*x)
。私も書けるようになりたいですfor(auto b: v) { /* ... */ }
質問:そのようなマルチプロキシアプローチはSTLのアルゴリズムで機能しますか?x
または、一部のアルゴリズムは、実際に必要な要件に本当に依存していますbool*
か?または、これが機能しないようにするために必要な連続したユーザー定義の変換が多すぎますか?上記の実装スケッチを完全に完成させる前に、そのような障害のいずれかを知りたいと思います。
更新(@HowardHinnantの回答とcomp.std.c ++に関するこの古代の議論に基づく)
組み込みのタイプをほぼ模倣するのに長い道のりがあります。任意のタイプTについて、reference_proxy :: operator&()とiterator_proxy :: operator *という意味で、プロキシのペア(reference_proxyとiterator_proxyなど)を相互に整合させることができます。 ()はお互いの逆です。
ただし、ある時点で、プロキシオブジェクトをマップしてT *またはT&のように動作させる必要があります。イテレータプロキシの場合、すべての機能を再実装せずに、operator->()をオーバーロードして、テンプレートTのインターフェイスにアクセスできます。ただし、参照プロキシの場合は、operator。()をオーバーロードする必要があります。これは、現在のC ++では許可されていません(ただし、SebastianRedlはBoostCon2013でそのような提案を提示しました)。参照プロキシ内の.get()メンバーのように詳細な回避策を作成するか、参照内にTのすべてのインターフェイスを実装できます(これはvector :: bit_referenceに対して行われることです)が、これにより組み込み構文が失われます。または、型変換のセマンティクスが組み込まれていないユーザー定義の変換を導入します(引数ごとに最大で1つのユーザー定義の変換を行うことができます)。