请考虑以下代码段:
class Foo {
public:
Foo( int Value );
// other stuff
};
std::list< boost::shared_ptr< Foo > > ListOfFoo = list_of( 1 )( 2 )( 3 )( 4 )( 5 );
这不是开箱即用的。使这项工作最简单的方法是什么,或者是否有任何方法可以将值ListOfFoo
分配给{{1}}这么简单?
答案 0 :(得分:3)
boost::assign::ptr_list_of
可让您使用非常简单的语法构造Boost pointer container。您可以通过私有继承扩展它,以便它允许您创建shared_ptr
:
template< class T >
struct shared_ptr_list : boost::assign_detail::generic_ptr_list<T>
{
typedef boost::assign_detail::generic_ptr_list<T> Base;
template< class Seq >
operator Seq() const
{
Seq result;
for(typename Base::impl_type::iterator it = Base::values_.begin(), e = Base::values_.end(); it != e; ++it)
result.push_back(typename Seq::value_type(&*it));
Base::values_.release().release();
return result;
}
template< class U >
shared_ptr_list& operator()( const U& u )
{
return (shared_ptr_list&)boost::assign_detail
::generic_ptr_list<T>::operator()(u);
}
};
template< class T, class U >
shared_ptr_list<T> shared_ptr_list_of( const U& t )
{
return shared_ptr_list<T>()(t);
}
它看起来有点难看但是使用起来非常方便:
int main()
{
using boost::shared_ptr;
std::deque<shared_ptr<Foo> > deq = shared_ptr_list_of<Foo>(1)(2)(3);
}
答案 1 :(得分:2)
另一种方法是在参数数组上使用std::transform
:
const unsigned DataSize = 5;
int data[DataSize] = {1, 2, 3, 4, 5};
std::list<boost::shared_ptr<Foo> > ListOfFoo;
std::transform(data, data + DataSize, std::back_inserter(ListOfFoo), &boost::make_shared<Foo, int>);
如果列表更大,也许看起来更好。
答案 2 :(得分:1)
std::list<boost::shared_ptr<Foo> > ListOfFoo = boost::assign::list_of(boost::make_shared<Foo>(1))(boost::make_shared<Foo>(2));
没有从Foo*
到shared_ptr<Foo>
的隐式转换。
shared_ptr<Foo> ptr = new Foo(1); // you can't do this
shared_ptr<Foo> ptr(new Foo(1)); // this is ok
shared_ptr<Foo> ptr = make_shared<Foo>(1); // this is also ok
你想要的是不可能的,你必须明确地创建共享指针并将它们传递给list_of
。
答案 3 :(得分:1)
您的boost :: list_of需要boost::shared_ptr<Foo>
类型的对象。所以你可以这样做:
typedef boost::shared_ptr<Foo> FooPtr;
std::list<boost::shared_ptr<Foo> > fooList = list_of
(FooPtr(new Foo(1))
(FooPtr(new Foo(2))
(FooPtr(new Foo(3));