这是this问题的延续,但我不想使用自定义删除器。我有以下界面:
struct Interface {
Interface(const Interface &) = delete;
auto operator=(const Interface &) -> Interface & = delete;
~Interface() = 0;
protected:
Interface() = default;
};
和一个实现:
struct Implementation : public Interface {
Implementation(Pool &p) : m_pool{p} {}
Pool &m_pool;
};
我也有一个实现池:
struct Pool {
auto get() -> std::unique_ptr<Interface>;
std::vector<std::unique_ptr<Interface>> m_objects;
};
我的问题是,是否有可能在调用其析构函数时将Implementation
实例化为指向Interface
的指针?
答案 0 :(得分:3)
我认为您可以通过创建包装器来实现。这就像从池中借用一个对象,一旦包装的对象超出范围,该对象将被放回池中。
struct PooledObject {
PooledObject(Pool& pool, std::unique_ptr<Interface> object)
: m_object(std::move(object)), m_pool(pool) {}
~PooledObject() {
m_pool.put(std::move(m_object));
}
// implement -> for easy access to underlying object
std::unique_ptr<Interface> m_object;
Pool& m_pool;
};
struct Pool {
auto get() -> PooledObject;
void put(std::unique_ptr<Interface> object);
}