STDLIB контейнерные адаптеры обеспечивают "заднюю дверь", чтобы получить доступ к основной контейнер: контейнер представляет собой защищенный член c
.
Поэтому вы можете наследовать от адаптера, чтобы получить доступ к контейнеру:
#include <queue>
#include <iostream>
template <class T>
class reservable_priority_queue: public std::priority_queue<T>
{
public:
typedef typename std::priority_queue<T>::size_type size_type;
reservable_priority_queue(size_type capacity = 0) { reserve(capacity); };
void reserve(size_type capacity) { this->c.reserve(capacity); }
size_type capacity() const { return this->c.capacity(); }
};
int main()
{
reservable_priority_queue<int> q;
q.reserve(10000);
std::cout << q.capacity() << '\n';
}
Если вы чувствуете себя плохо о наследовании от класса STDLIB, использовать закрытое наследование и сделать все методы priority_queue
доступных с using
деклараций ,
+1 Я обычно был против наследования стандартного контейнера по теоретическим соображениям, но в этом случае техника во мне говорит мне, что это может быть лучшим решением. –
Мне не нравится это решение по двум причинам: 1/наследование от класса, у которого есть публичный не виртуальный деструктор, плохо себя чувствует, очень плохо, 2/этот бэкдор не упоминается ни на cplusplus.com, ни на http://www.sgi.com/tech/stl ... У меня плохое ощущение, что это специфичный для реализации и НЕ стандартный. –
@Matthiew M. Бэкдор в стандарте, так что это технически правильно. Я согласен с тем, что наследование из контейнера не является лучшим советом в целом ... –