此类问题的解决方案是预销毁阶段,您可以在其中手动控制销毁的发生方式。
pImpl
使用该模式实现您的对象。当包装对象被销毁时,pImpl
在销毁它之前通知它将被销毁。
pImpl
可以有一个virtual PreDestroyable
允许子方法注册PreDestruction
回调的基类,您可以在此预销毁阶段调用该回调。
class Destroyable {
protected:
Destroyable() {}; // must be empty
virtual ~Destroyable() { Assert(PreDestroyers.empty()); };
void RegisterPreDestroy( std::function<void()> const& func ) { PreDestroyers.push_back(func) );
private:
std::vector<std::function<void()>> PreDestroyers;
public:
// reverse order, reentrant:
void PrepareToDie() {
while (!PreDestroyers.empty()) {
auto f = PreDestroyers.back();
PreDestroyers.pop_back();
f();
}
}
};
// handles registration:
template<typename T>
class HasPreDestroyCode: public virtual Destroyable {
// TODO: usual CRTP static or dynamic checks:
T* self() { return static_cast<T*>(this); }
T const* self() const { return static_cast<T*>(this); }
HasPreDestroyCode() {
RegisterPreDestroy( [&]() { self()->PreDestroy(); } );
}
HasPreDestroyCode( HasPreDestroyCode const& other ) {
RegisterPreDestroy( [&]() { self()->PreDestroy(); } );
}
HasPreDestroyCode( HasPreDestroyCode const& other ) {
RegisterPreDestroy( [&]() { self()->PreDestroy(); } );
}
private:
HasPreDestroyCode& operator=( HasPreDestroyCode const& other ) = delete;
};
class Test: HasPreDestroyCode<Test> {
public:
void PreDestroy() {}
};
我上次在 C++11 之前写了这些东西,所以我还没有弄清楚如何处理构建它的移动。并且这一切都是在运行时完成的,而可能用更少的运行时数据来做类似上面的事情。类似于层次结构中包含预销毁代码的类型列表之类的东西?