2

クラスにメンバー変数std::vector<std::string>があり、 と の組み合わせを使用して、メンバー関数から不変ビューとしてそれを返したいとしgsl::array_viewますgsl::cstring_view。残念ながら、以下はコンパイルされません。

class C {
public:
    gsl::array_view<const gsl::cstring_view<>> getVectorOfStrings() const 
    { 
         return _vectorOfStrings; 
    }

private:
    std::vector<std::string> _vectorOfStrings;
};

cstring_viewこれは、array_viewを作成できるコンテナーがないためです。だから私の質問は: type のメンバーのようなものを明示的に追加せずにそのような構造を使用する方法はありstd::vector<gsl::cstring_view<>>ますか?これは明らかに望ましくありませんか?

編集

そのような「変換」ビューは、より一般的に使用できるように思えます。実装定義のストレージ アプローチを公開せずに、生のポインターとしてクラスのユーザーに公開したいvectorなどの所有ポインターを持つことを検討してください。考え?std::vector<std::shared_ptr<T>>array_viewgsl::array_view<const T*>

4

1 に答える 1

1

定義によると、ビューは通常、既存のオブジェクトへの参照のみを提供します。その結果、array_view<const cstring_view<>>最初に のような一致するコンテナを作成せずに法線を作成する方法はありませんvector<const cstring_view<>>

ただし、できることは、オンデマンドgsl::array_view<const cstring_view<>>を作成するための独自の特殊化を作成することですcstring_view<>(インデックス演算子が呼び出され、反復子が逆参照されるとき)。これにより、動的なメモリ割り当てが節約され、素朴なアプローチと比較してメモリのフットプリントが削減されますが、ほとんどの場合、複雑さが増す価値はありません。

編集で説明されている一般化されたアプローチに従いたい場合は、boost::transform_iterator直接使用するため、または独自の一般化されたtransform_array_viewクラスのインスピレーションとして (これは、 gsl またはブースト)。

于 2015-11-09T22:56:19.893 に答える