Quote:
|
Originariamente inviato da Renxy
servono le operazioni generiche che si usano sui vettori : inserimento, accesso per indice, norma, massimo, minimo, ordinamento etc.
|
Ok, quindi diciamo queste tre ad esempio:
insert(T& t);
remove(int index);
sort();
Tiro a caso, per capirci.
Ecco una possibile semplice implementazione policy based:
Codice:
template <typename T>
class StandardListContainer
{
private:
std::list<T> m_List;
public:
void Insert(T item)
{
m_List.push_back(item);
}
void Remove(T item)
{
m_List.remove(item);
}
void Sort()
{
std::sort(list.begin(), list.end(), std::less<T>());
}
};
template <typename T>
class NullContainer
{
public:
void Insert(T item)
{
}
void Remove(T item)
{
}
void Sort()
{
}
};
template<typename T, typename ContainerPolicy = StandardListContainer<T> > class SparseVector
{
private:
ContainerPolicy m_Container;
public:
SparseVector()
{
// Insert some items just for fun...
m_Container.Insert(T());
}
~SparseVector()
{
// Remove an item just to try the policy...
m_Container.Remove(T());
}
void Process()
{
// Do crazy stuff here...
m_Container.Sort();
// Do some more crazy stuff here...
}
};
Nota come puoi creare classi SparseVector che usino uno o l'altro container che specifichi quando instanzi il template:
Codice:
SparseVector<int> sparseVectorInt;
SparseVector<int, NullContainer<int> > nullSparseVector;
Di default usi il container basato su std::list. Il Container deve solo onorare l'interfaccia imposta implicitamente da SparseVector e questa e' la parte piu' rognosa in C++ perche' non ti concede nessuno strumento esplicito per gestirla.