4

我有一堂课:

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

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

它有一个vectorofshared_ptr类型T。出于某种原因,它需要公开一个方法来返回这个向量。但是,我不想修改向量的内容,也不想修改指向的对象。所以我需要返回一个vectorof shared_ptr<const T>

我的问题是,有没有有效的方法来实现这一目标?如果我简单地返回它,它可以工作,但它需要重建一个向量,这有点昂贵。

谢谢。

4

3 回答 3

4

你不能直接这样做——但你可以在你的容器上定义“视图”,让你做一些非常相似的事情,如果你想确保你的指针是常量:

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

为什么不将它作为一组iterators 返回呢?

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>:一个内存分配和 N 个原子增量(大约)。

如果您要避免创建返回的向量(即按值返回),那么无论与模板的参数有多相关,不同的模板实例都是不相关的类型,这是不可能的。

于 2012-10-15T21:51:23.420 回答