Я реализую четыре алгоритма, которые полностью идентичны, за исключением того, какую структуру данных они используют - два используют priority_queue
, один использует stack
, а последний использует queue
.Они относительно длинные, поэтому я хотел бы иметь только один шаблон функции, который принимает тип контейнера в качестве аргумента шаблона, а затем каждый алгоритм вызывает этот шаблон с соответствующим аргументом, например:
template <class Container>
void foo(/* args */)
{
Container dataStructure;
// Algorithm goes here
}
void queueBased(/* args */)
{
foo<queue<Item> >(/* args */);
}
void stackBased(/* args */)
{
foo<stack<Item> >(/* args */);
}
Мне удалось сделать это только с реализациями на основе priority_queue
и stack
, но я не могу сделать то же самое для алгоритма на основе queue
, потому что он использует другое имя для доступа к переднему элементу(front( )
вместо top( )
).Я знаю, что мог бы специализировать шаблон для этого случая, но тогда у меня был бы большой участок дублированного кода (чего я и стараюсь избегать).
Какой лучший способ сделать это?Моим первым инстинктом было создание класса-обертки для очереди, который добавляет операцию top( )
, эквивалентную stack
, но я читал, что подклассы классов STL - нет-нет.Как я тогда получу это поведение?