Мне нравится с идеями С++, и я немного застрял в этой проблеме.
Мне нужен класс LIFO
, который управляет пулом ресурсов.
Когда запрашивается ресурс (через acquire()
), он возвращает объект как unique_ptr
, который при удалении приводит к возврату ресурса в пул.
Единичные тесты:
// Create the pool, that holds (for simplicity, int objects)
SharedPool<int> pool;
TS_ASSERT(pool.empty());
// Add an object to the pool, which is now, no longer empty
pool.add(std::unique_ptr<int>(new int(42)));
TS_ASSERT(!pool.empty());
// Pop this object within its own scope, causing the pool to be empty
{
auto v = pool.acquire();
TS_ASSERT_EQUALS(*v, 42);
TS_ASSERT(pool.empty());
}
// Object should now have returned to the pool
TS_ASSERT(!pool.empty())
Основная реализация, которая пройдет тесты, за исключением важного финального теста:
template <class T>
class SharedPool
{
public:
SharedPool(){}
virtual ~SharedPool(){}
void add(std::unique_ptr<T> t) {
pool_.push(std::move(t));
}
std::unique_ptr<T> acquire() {
assert(!pool_.empty());
std::unique_ptr<T> tmp(std::move(pool_.top()));
pool_.pop();
return std::move(tmp);
}
bool empty() const {
return pool_.empty();
}
private:
std::stack<std::unique_ptr<T> > pool_;
};
Вопрос:. Как сделать так, чтобы acquire()
возвращал unique_ptr
такого типа, что у дебетера есть знания this
и вызывает this->add(...)
, возвращая ресурс обратно в бассейн.