4

私はクラスを持っています:

class X {
  vector<shared_ptr<T>> v_;

 public:
  vector<shared_ptr<const T>> getTs() { return v_; }
};

のタイプvectorがあります。何らかの理由で、このベクトルを返すメソッドを公開する必要があります。ただし、ベクトルのコンテンツを変更したくありません。また、ポイントされているオブジェクトも変更されません。だから私はのを返す必要があります。shared_ptrTvectorshared_ptr<const T>

私の質問は、これを達成するための効率的な方法はありますか?単純に返すと機能しますが、ベクトルを再構築する必要があり、コストがかかります。

ありがとう。

4

3 に答える 3

4

これを直接行うことはできませんが、ポインティがconstであることを確認したい場合は、コンテナに「ビュー」を定義して、非常によく似た処理を実行できます。

boost::any_range<
  std::shared_ptr<const int>,
  boost::random_access_traversal_tag,
  std::shared_ptr<const int>,
  std::ptrdiff_t
> foo(std::vector<std::shared_ptr<int>>& v)
{
  return v;
}

単純な変換イテレータアダプタ/変換された範囲でもうまくいく可能性があります。これを使用して要点を説明しました。

于 2012-10-15T22:28:08.580 に答える
2

sのセットとして返してみませんiteratorか?

class X {
  vector<shared_ptr<T>> v_;
  class const_iterator : std::iterator< std::bidirectional_iterator_tag, T >
  {
    vector<shared_ptr<T>>::iterator it;
    const_iterator( vector<shared_ptr<T>>::iterator& v ) :it (v) { }
    const T& operator*() { return const_cast<const T>( **it ); }
    //forward all methods
  }

   public:
  const_iterator ts_begin() { return const_iterator(v_.begin()); }
  const_iterator ts_end() { return const_iterator(v_.end()); }
};

または同様のもの?これにより、タイプとそのアクセス方法を完全に制御できます。さらに、APIを変更せずに後でタイプを変更できます。

于 2012-10-15T22:14:21.893 に答える
1

値で返すので、元のベクトルのコピーを返す場合でも、次のベクトルのコピーを返す場合でも、コストは同じですshared_ptr<T const>。1つのメモリ割り当てとN個のアトミック増分(約)。

返されるベクトルの作成(つまり、値による戻り)が避けたい場合は、引数がテンプレートにどのように関連していても、異なるテンプレートのインスタンス化は無関係なタイプであるため、不可能です。

于 2012-10-15T21:51:23.420 に答える