vendettaaaaa
21-05-2013, 22:10
Ciao,
ho una classe che contiene questi typedef:
classe MyVector
{
public:
// ****************** Typedefs for the user
typedef double value_type;
typedef double& reference;
typedef const double& const_reference;
typedef double* iterator;
typedef const double* const_iterator;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
};
Ho un costruttore che costruisce l'oggetto (un vettore di double) partendo da un array di double:
MyVector(size_type n, const double* array);
che sfrutta la seguente funzione privata:
// Private function for memory management: create a BbVector by copying another BbVector using iterators (similar to one of std::vector constructors)
void MyVector::create(const_iterator b, const_iterator e)
{
mySize = e - b;
myVector = alloc.allocate(mySize + 1);
start = myVector + 1;
limit = avail = start + mySize;
uninitialized_copy(b, e, start);
}
dove alloc è uno std::allocator<double>.
Ho un altro costruttore, che prende uno std::vector:
BbVector::BbVector(const vector<double>& vec)
{
size_type n = vec.size();
if (n == 0)
{
create();
}
else
{
create(vec.cbegin(), vec.cend());
}
}
Purtroppo questo costruttore non compila: la funzione create prende in input un const double*, mentre qui gli passo un std::vector<double>::const_iterator, cioè
typedef __gnu_cxx::__normal_iterator<const_pointer, vector> const_iterator, con tutti i typedef del caso...
Allora ho pensato di rendere create una funzione template, scrivendo:
template<class C>
void BbVector::create(typename C::const_iterator b, typename C::const_iterator e)
{
mySize = e - b;
myVector = alloc.allocate(mySize + 1);
start = myVector + 1;
limit = avail = start + mySize;
uninitialized_copy(b, e, start);
}
Funziona, solo per il vector, infatti non posso più scrivere:
create<const double*>(array, array + n);
giustamente, visto che il tipo const double* non ha un membro chiamato const_iterator...
L'unico modo per farla funzionare quando la invoco passandogli l'array di double è:
create<MyVector>(array, array + n);
però mi sembra un po' astruso instanziare un template, definito dentro alla mia classe, usando la classe stessa...
Qualcuno sa suggerirmi una soluzione migliore? Ho appena cominciato a studiare i template in modo approfondito, e sono un po' spaesato :D
ho una classe che contiene questi typedef:
classe MyVector
{
public:
// ****************** Typedefs for the user
typedef double value_type;
typedef double& reference;
typedef const double& const_reference;
typedef double* iterator;
typedef const double* const_iterator;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
};
Ho un costruttore che costruisce l'oggetto (un vettore di double) partendo da un array di double:
MyVector(size_type n, const double* array);
che sfrutta la seguente funzione privata:
// Private function for memory management: create a BbVector by copying another BbVector using iterators (similar to one of std::vector constructors)
void MyVector::create(const_iterator b, const_iterator e)
{
mySize = e - b;
myVector = alloc.allocate(mySize + 1);
start = myVector + 1;
limit = avail = start + mySize;
uninitialized_copy(b, e, start);
}
dove alloc è uno std::allocator<double>.
Ho un altro costruttore, che prende uno std::vector:
BbVector::BbVector(const vector<double>& vec)
{
size_type n = vec.size();
if (n == 0)
{
create();
}
else
{
create(vec.cbegin(), vec.cend());
}
}
Purtroppo questo costruttore non compila: la funzione create prende in input un const double*, mentre qui gli passo un std::vector<double>::const_iterator, cioè
typedef __gnu_cxx::__normal_iterator<const_pointer, vector> const_iterator, con tutti i typedef del caso...
Allora ho pensato di rendere create una funzione template, scrivendo:
template<class C>
void BbVector::create(typename C::const_iterator b, typename C::const_iterator e)
{
mySize = e - b;
myVector = alloc.allocate(mySize + 1);
start = myVector + 1;
limit = avail = start + mySize;
uninitialized_copy(b, e, start);
}
Funziona, solo per il vector, infatti non posso più scrivere:
create<const double*>(array, array + n);
giustamente, visto che il tipo const double* non ha un membro chiamato const_iterator...
L'unico modo per farla funzionare quando la invoco passandogli l'array di double è:
create<MyVector>(array, array + n);
però mi sembra un po' astruso instanziare un template, definito dentro alla mia classe, usando la classe stessa...
Qualcuno sa suggerirmi una soluzione migliore? Ho appena cominciato a studiare i template in modo approfondito, e sono un po' spaesato :D