【问题标题】:std::set of boost::weak_ptr<T> - Getting const_iterator to const T?std::set of boost::weak_ptr<T> - 让 const_iterator 到 const T?
【发布时间】:2011-03-26 18:27:28
【问题描述】:

我的课程包含boost::weak_ptr&lt;T&gt;std::set。我有两个函数 begin() 和 end() 将迭代器返回到容器。但是,我不希望客户能够修改T。简单地返回一个const_iterator 是行不通的,因为boost::weak_ptr 指向的T 将是可编辑的。

我想要做的是将const_iterator 返回到std::set&lt;boost::weak_ptr&lt;T const&gt; &gt;。从std::set&lt;boost::weak_ptr&lt;T&gt; &gt;::const_iterator 投射不起作用。有什么办法可以得到我想要的行为吗?

【问题讨论】:

  • 您的这两个陈述似乎是矛盾的:1)我不希望客户能够修改 T 和 2)因为 boost 指向的 T ::weak_ptr 将是可编辑的。。这是什么意思?
  • @Nawaz 我的意思是:将const_iterator 返回到std::set&lt;boost::weak_ptr&lt;T&gt; &gt; 使得客户端无法修改weak_ptr。但是,他仍然可以从中获取shared_ptr&lt;T&gt;,然后随意修改T。这正是我不希望发生的事情。

标签: c++ boost iterator weak-ptr


【解决方案1】:

您可以编写一个转换迭代器来将weak_ptr&lt;T&gt; 转换为weak_ptr&lt;const T&gt;。由于您已经在使用 Boost,您可以使用boost::transform_iterator

#include <boost/iterator/transform_iterator.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>

#include <set>

// Functor to transform a weak_ptr<T> to a weak_ptr<const T>
template <typename T>
struct make_weak_ptr_const
    : std::unary_function<boost::weak_ptr<T>, boost::weak_ptr<const T> >
{
    boost::weak_ptr<const T> operator()(const boost::weak_ptr<T>& p) const
    {
        return p;
    }
};

struct S { };

// Container demonstrating use of make_weak_ptr_const:
struct my_awesome_container
{
    typedef std::set<boost::weak_ptr<S> > BaseSet;
    typedef BaseSet::const_iterator       BaseIterator;

    typedef boost::transform_iterator<
                make_weak_ptr_const<S>, 
                BaseIterator
            > iterator;

    iterator begin() const 
    {
        return TransformedIterator(data.begin());
    }

    iterator end() const
    {
        return TransformedIterator(data.end());
    }

    std::set<boost::weak_ptr<S> > data;
};

如果您不想使用boost::transform_iterator,那么编写自己的代码是一项简单的任务。我在an answer to another question 中展示了如何做到这一点。

【讨论】:

  • 谢谢,我不知道有这样的功能。这是完美的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多