#pragma once

#include <utility>

template<typename T, template<typename... S> typename Container> class pack : protected Container<T> {
public:
	using Container<T>::Container;

	using Container<T>::begin;
	using Container<T>::end;
	using Container<T>::rbegin;
	using Container<T>::rend;
	using Container<T>::cbegin;
	using Container<T>::cend;
	using Container<T>::crbegin;
	using Container<T>::crend;
	using Container<T>::clear;
	using Container<T>::empty;
	using Container<T>::size;
	using Container<T>::capacity;
	using Container<T>::shrink_to_fit;
	using Container<T>::at;
	using Container<T>::data;
	using Container<T>::operator[];

	template<typename... Ps>
	decltype(auto)
	emplace(Ps &&... ps)
	{
		return Container<T>::emplace_back(std::forward<Ps>(ps)...);
	}

	void
	erase(typename Container<T>::iterator pos)
	{
		if (&*pos != &Container<T>::back()) {
			*pos = std::move(Container<T>::back());
		}
		Container<T>::pop_back();
	}
};