我有一个类,其中包含一个包含boost::shared_ptrs另一个类的对象的列表.
允许访问列表返回原始指针中的元素的类成员函数.为了保持一致性,我还希望能够使用原始指针而不是shared_ptrs进行迭代.因此,当我取消引用列表迭代器时,我想获得原始指针,而不是shared_ptr.
我假设我需要为此编写一个自定义迭代器.它是否正确?如果是这样,有人能指出我正确的方向 - 我以前从未这样做过.
这是使用Boost transform_iterator的选项:
#include <list>
#include <boost/iterator/transform_iterator.hpp>
#include <tr1/memory>
#include <tr1/functional>
using std::list;
using std::tr1::shared_ptr;
using boost::transform_iterator;
using boost::make_transform_iterator;
using std::tr1::mem_fn;
using std::tr1::function;
struct Foo {};
struct Bar
{
typedef shared_ptr< Foo > Ptr;
typedef list< Ptr > List;
typedef function< Foo* (Ptr) > Functor;
typedef transform_iterator< Functor, List::iterator > Iterator;
Iterator begin()
{
return make_transform_iterator( fooptrs.begin(), mem_fn( &Ptr::get ) );
}
Iterator end()
{
return make_transform_iterator( fooptrs.end(), mem_fn( &Ptr::get ) );
}
List fooptrs;
};
Run Code Online (Sandbox Code Playgroud)
C++ 11可以很容易地消除function包装器,但我没有编译器方便测试它.Iterator如果你看到了需要,你也可以隐藏使用类型擦除的具体类型(我认为Adobe any_iterator为此提供了一个免费的类模板.)