Sto progettando una struttura dati in C ++ e voglio esporre un'interfaccia all'utente per attraversare la struttura in un certo ordine. Invece di creare diversi tipi di enumeratori, voglio mantenerlo semplice e fornire un singolo enumeratore, pur mantenendo la correttezza della const.
Il mio design è riassunto come segue:
class DataStructureNode; // The basic building block of the structure
class DataStructureEnumerator
{
public:
friend class DataStructure;
DataStructureEnumerator GetNext() { ... }
DataStructureEnumerator GetPrevious() { ... }
private:
const DataStructureNode* m_Node;
...
};
class DataStructure
{
public:
DataStructureEnumerator GetEnumerator() { ... }
DataStructureNode* GetNodeFromEnumerator(const DataStructureEnumerator& e)
{
// Let's assume this function also ensures the node belongs to this structure
return const_cast<DataStructureEnumerator&>(e).m_Node; // <--- Ooo! const_cast!
}
const DataStructureNode* GetNodeFromEnumerator(const DataStructureEnumerator& e) const
{
// Let's assume this function also ensures the node belongs to this structure
return e.m_Node;
}
};
Questo design ha il vantaggio che esiste un solo tipo di enumeratore che gestisce sia strutture mutevoli che immutabili.
Ovviamente, la progettazione alternativa (e convenzionale) in C ++ deve avere due (o più) classi di enumeratori, come DataStructureEnumerator
e DataStructureConstEnumerator
. Il design convenzionale viene aggiunto con un aumento del codice, più modelli e un'interfaccia più brutta (secondo me!), Ma è la norma nelle comunità C ++.
Sono interessato ad ascoltare le opinioni della comunità su questo design. Ci sono delle potenziali insidie che mi mancano con il mio design?