Sto implementando quattro algoritmi che sono completamente identici a, tranne per la struttura dei dati che utilizzano: due utilizzano priority_queue
, uno utilizza stack
e l'ultimo utilizza queue
. Sono relativamente lungo, quindi mi piacerebbe avere un solo modello di funzione che accetta il tipo di contenitore come argomento di un template e poi ogni chiamata algoritmo che modello con l'argomento del caso, in questo modo:Come posso scrivere un modello di funzione che può accettare uno stack o una coda?
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 sono riuscito a fare proprio questo con le implementazioni basate su priority_queue
e stack
, ma non posso fare lo stesso per l'algoritmo basato su queue
perché utilizza un nome diverso per accedere all'elemento più avanzato (front()
anziché top()
). So che potrei specializzare il modello per questo caso, ma poi avrei una grande quantità di codice duplicato (che è quello che sto cercando di evitare).
Qual è il modo migliore per farlo? Il mio primo istinto è stato quello di creare una classe wrapper per la coda che aggiunge un'operazione top()
equivalente a stack
, ma ho letto che le classi STL di sottoclassi sono un no-no. Come dovrei ottenere questo comportamento, allora?
Sto implementando un insieme di algoritmi di ricerca, quindi ho bisogno dello specifico comportamento degli adattatori degli ordini. (LIFO mi offre una ricerca in ampiezza mentre FIFO mi dà la profondità prima, ad es.) –