std::boost::weak_ptr 集- 将 const_iterator 转换为 const T?

发布于 2024-10-27 01:38:50 字数 435 浏览 1 评论 0 原文

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

我想要做的是将 const_iterator 返回到 std::set; >。从 std::set 进行转换>::const_iterator 不起作用。有什么办法可以得到我想要的行为吗?

I have class containing an std::set of boost::weak_ptr<T>. I have two functions begin() and end() that return an iterator to the container. However, I don't want clients to be able to modify T. Simply returning a const_iterator won't work, because the T pointed to by the boost::weak_ptr will be editable.

What I want to do is return a const_iterator to std::set<boost::weak_ptr<T const> >. Casting from std::set<boost::weak_ptr<T> >::const_iterator does not work. Is there any way to get the behaviour I want?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

硪扪都還晓 2024-11-03 01:38:50

您可以编写一个转换迭代器来将weak_ptr转换为weak_ptr。由于您已经在使用 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 中展示了如何执行此操作回答另一个问题

You can write a transform iterator to convert the weak_ptr<T> to a weak_ptr<const T>. Since you're already using Boost, you can use 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;
};

If you don't want to use boost::transform_iterator, it is a straightforward task to write your own. I showed how to do this in an answer to another question.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文