Я реализую четыре алгоритма, которые полностью идентичны, за исключением того, какую структуру данных они используют - два используют priority_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
, но я могу ' Сделайте то же самое для алгоритма на основе очереди
, потому что он использует другое имя для доступа к переднему элементу ( front ()
вместо top ()
). Я знаю, что могу специализировать шаблон для этого случая, но тогда у меня будет большой участок дублированного кода (чего я пытаюсь избежать).
Как лучше всего это сделать? Моим первым побуждением было создать класс-оболочку для очереди, который добавляет операцию top ()
, эквивалентную операции stack
, но я читал, что создание подклассов классов STL недопустимо. нет. Тогда как мне добиться такого поведения?