问题
考虑这个简单的类:
struct C {
C(const char* name) : name(name) {
cout << "constructing " << name << endl;
}
~C() {
cout << "destructing " << name << endl;
}
string name;
};
我想有一个指向这个类的实例的指针,它通常会被另一个实例替换。但是,我希望在创建新实例之前销毁当前实例。
错误的例子
如果我unique_ptr
以正常方式使用 a ,这不起作用:
unique_ptr<C> c( new C("the first one"));
c.reset(new C("the second one"));
(不需要的)输出:
构建第一个
构建第二个
破坏第一个
破坏第二个
丑陋的例子
可以达到预期的效果如下:
unique_ptr<C> c( new C("the first one"));
c.reset(); // explicitly destruct the first one first
c.reset(new C("the second one"));
输出:
构建第一个
破坏第一个
构建第二个
破坏第二个
尝试的解决方案
这是我尝试创建具有这种行为的智能指针。这样的智能指针是否已经存在?
template<typename Resource>
class ResourceManager {
public:
ResourceManager() {}
template<typename... Arguments>
ResourceManager(Arguments&&... args) {
replace<Arguments...>(std::forward<Arguments>(args)...);
}
template<typename... Arguments>
void replace(Arguments&&... args) {
resource.reset();
resource.reset(new Resource(std::forward<Arguments>(args)...));
}
private:
unique_ptr<Resource> resource;
};
template<typename Resource, typename... Arguments>
ResourceManager<Resource> make_resource_manager(Arguments... args) {
return ResourceManager<Resource>(args...);
}
int main() {
//ResourceManager<C, const char*> r("first1");
auto r = make_resource_manager<C>("first1");
r.replace("second1");
}
输出:
构建第一个
破坏第一个
构建第二个
破坏第二个
编辑:将“参数...”模板移至函数级别。
编辑 2:现在正确转发“参数”。