我已经读过,一个不能存储std::auto_ptr
,std::vector
可以boost::ptr_vector
代替使用。我已经能够这样做,但是ptr_vector
当我不想存储指针时,我不知道如何使用,而是存储一个具有指针成员的结构。
在此示例中,我想打开一些文件并将关联的ofstream
对象与一些附加数据一起存储,以供以后使用。我想用智能指针替换file
字段。struct data
由于vector<data> v
应该是所有者,我认为 ashared_ptr
会起作用,但不合适。
我应该用什么替换裸指针file
?
#include <iostream>
#include <fstream>
#include <vector>
struct data {
std::string filename;
std::ofstream* file;
data(const std::string filename, std::ofstream* file)
: filename(filename), file(file)
{
}
};
std::vector<data> open_files()
{
std::vector<data> v;
v.push_back(data("foo", new std::ofstream("foo")));
return v;
}
int main()
{
std::vector<data> v = open_files();
/* use the files */
*(v[0].file) << "foo";
delete v[0].file; // either rely on dtor to close(), or call it manually
}
更新: 我觉得我在描述我的问题方面做得不够好,让我试试另一个例子。我也在寻找 C++03 解决方案:
#include <memory>
#include <vector>
#include <boost/ptr_container/ptr_vector.hpp>
struct T {
std::auto_ptr<int> a;
};
int main()
{
// instead of
// std::vector<std::auto_ptr<int> > v;
// use
boost::ptr_vector<int> v;
// what to use instead of
// std::vector<T> w;
}