Как я могу написать шаблон функции, который может принимать либо стек, либо очередь?

Я реализую четыре алгоритма, которые полностью идентичны, за исключением того, какую структуру данных они используют - два используют 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 недопустимо. нет. Тогда как мне добиться такого поведения?

5
задан Joel McCance 27 January 2011 в 20:54
поделиться