c++ - boost::shared_ptr 和 boost::transform_iterator 的 bimap

标签 c++ boost iterator

我有一个boost::bimap<int, boost::shared_ptr<A>>容器并希望将迭代器返回到左 View ,以确保内容的一致性。返回container.left.begin()返回一个取消引用 std::pair<int const, boost::shared_ptr<A> const> 的迭代器.

显然,这不是我想要的,因为可以更改 A通过取消引用 shared_ptr 。我想要一个取消引用 std::pair<int const, boost::shared_ptr<A const>> 的迭代器(我真的不在乎shared_ptr是否是const)。我知道我应该使用 boost::transform_iterator 来做到这一点,但我不知道“casting”函数应该是什么样子。

有人可以帮我解决这个问题吗?还是有另一种更简单的方法来获得我想要的东西?

编辑:这就是我到目前为止所得到的,足以说,它给了我 2 个屏幕的错误。

typedef boost::bimap<unsigned int, boost::shared_ptr<A> > container_type;
typedef container_type::left_const_iterator base_const_iterator;
typedef boost::transform_iterator<makeIterConst<A>, base_const_iterator> const_iterator;

template <typename T>
struct makeIterConst : std::unary_function<std::pair<unsigned int const, boost::shared_ptr<T> const>, std::pair<unsigned int const, boost::shared_ptr<T const> const> >
{
  std::pair<unsigned int const, boost::shared_ptr<T const> const> operator() (std::pair<int const, boost::shared_ptr<T> const> const & orig) const
  {
    std::pair<int const, boost::shared_ptr<T const> const> newPair(orig.first, boost::const_pointer_cast<T const>(orig.second));
    return newPair;
  }
};

这是“核心”错误:

note: candidate function not viable: no known conversion from 'const boost::bimaps::relation::structured_pair, boost::bimaps::tags::tagged, boost::bimaps::relation::member_at::right>, mpl_::na, boost::bimaps::relation::normal_layout>' to 'const std::pair >' for 1st argument

最佳答案

问题是您的 value_type 实际上不是 std::pair (并且不能隐式转换为 1),因此无法传递给 makeIterConst::operator()

改为使用 const base_const_iterator::value_type &

#include <iostream>
#include <string>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/bimap.hpp>
#include <boost/iterator/transform_iterator.hpp>

struct A
{
    std::string data;
    A(const std::string& s) : data(s) {}
};

typedef boost::bimap<unsigned int, boost::shared_ptr<A> > container_type;
typedef container_type::left_map::const_iterator base_const_iterator;

template <typename T>
struct makeIterConst : std::unary_function<base_const_iterator::value_type const &,
                                           std::pair<unsigned int const, boost::shared_ptr<T const> const> >
{
     std::pair<unsigned int const, boost::shared_ptr<T const> const> operator()
             (base_const_iterator::value_type const & orig) const
     {
         std::pair<int const, boost::shared_ptr<T const> const> newPair(orig.first, boost::const_pointer_cast<T const>(orig.second));
         return newPair;
     }
};

typedef boost::transform_iterator<makeIterConst<A>,
                                 base_const_iterator> const_iterator;

int main()
{
    container_type m;
    boost::shared_ptr<A> p = boost::make_shared<A>("foo");
    m.insert( container_type::value_type(1, p));

//  using regular iterator
    for( base_const_iterator left_iter = m.left.begin();
                         left_iter != m.left.end();
                         ++left_iter )
    {
        std::cout << left_iter->first << " --> " << left_iter->second->data << '\n';
        left_iter->second->data =  "bar"; // compiles
    }

    // using constified iterator
    for( const_iterator left_iter = boost::make_transform_iterator(m.left.begin(), makeIterConst<A>() );
              left_iter != boost::make_transform_iterator(m.left.end(), makeIterConst<A>() );
            ++left_iter )
    {
        std::cout << left_iter->first << " --> " << left_iter->second->data << '\n';
//   the following will give a compilation error, as expected
//      left_iter->second->data =  "changed_foo";
    }
}

测试:https://ideone.com/fHIUe

关于c++ - boost::shared_ptr 和 boost::transform_iterator 的 bimap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5778294/

相关文章:

c++ - 如何将仿函数与 bind 和 weak_ptr 结合使用

C++ - 移位返回负数

c++ - 结构中的结构,动态内存分配

c++ - 遍历 std::set 中包含的所有三重不同值?

php - 如何在 PHP 中使用 RegexIterator

java - 如何在 Java 中为 DAG 结构创建迭代器包装器?

c++ - 不完整类型的 std::unique_ptr 无法编译

multithreading - boost::线程和模板函数

c++ - boost日期时间——输出格式

c++ - 在 C++14 编译器中使用 Boost