Estoy implementando cuatro algoritmos que son completamente idénticos excepto por la estructura de datos que utilizan - dos usan priority_queue
, uno usa stack
, y el último usa queue
. Son relativamente largo, así que me gustaría tener sólo una plantilla de función que acepte el tipo de contenedor como un argumento de plantilla y luego tener cada llamada algoritmo que plantilla con el argumento apropiado, así:¿Cómo puedo escribir una plantilla de función que pueda aceptar una pila o una cola?
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 */);
}
I He logrado hacer esto con las implementaciones basadas en priority_queue
y stack
, pero no puedo hacer lo mismo con el algoritmo basado en queue
porque usa un nombre diferente para acceder al elemento principal (front()
en lugar de top()
). Sé que podría especializar la plantilla para este caso, pero luego tendría una gran cantidad de código duplicado (que es lo que estoy tratando de evitar).
¿Cuál es la mejor manera de lograr esto? Mi primer instinto fue crear una clase contenedora para la cola que agrega una operación top()
equivalente a stack
, pero he estado leyendo que las clases STL de subclases son un no-no. ¿Cómo debería obtener este comportamiento, entonces?
Estoy implementando un conjunto de algoritmos de búsqueda, por lo que necesito el comportamiento de ordenamiento específico de los adaptadores. (LIFO me da una búsqueda de amplitud mientras que FIFO me da profundidad-primero, por ejemplo) –