Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Templatizar funciones para arrays?

Iniciado por Pogacha, 17 de Diciembre de 2007, 06:14:28 PM

« anterior - próximo »

Pogacha

Como puedo hacer esto?


class Acumulador {

 template<class T> Acumulador& operator+(Acumulador& c, T& v)
 {
   // hago algo
   return c;
 }

 template<class T, int N> Acumulador& operator+(Acumulador& c, T[N]& a)
 {
    for(int i=0;i<N; ++i) c += a[i];
    return c;
 }

};


Como hago para decirle a una función que me acepte un array de cualquier tipo y de cualquier tamaño?
Obviamente ese codigo no me compila, he probado varias cosas (clases intermedias y demas, pero naranja)

Saludos

tamat

Jurl... eso de usar arrays de tamaño fijo como parametro nunca me ha molado.

Qué problema hay en pasar un std::vector ?
Por un stratos menos tenso

Pogacha

Nínguno, pero quiero y necesito que me tome arrays también.

ethernet

No es lo mismo que una referencia a un puntero? no entiendo bien la pregunta

Pogacha

Siguiendo el codigo de arriba, lo que quiero al final poder hacer es esto:

Acumulador c;
int arreglo[10];

c += arreglo;


Puedo hacer una función especial y pasarle el tamaño tambien y con un pequeño macro tengo resuelto el pescado, pero pierdo la sintaxys.

#define ADD_ARRAY(C, A) c.Add( A, sizeof(A) / sizeof(A[0]) )

Lo que busco es una solución automatica como la que hace boost en su serialización, pero lamentablemente la ingenieria inversa no me funcionó.

davur

Para que la función acepte arrays y no punteros:

template <class T, int N>
bar& foo(T (&a)[N])
{
   // ...
}

Pogacha

Citarerror C2265: '<Unknown>' : reference to a zero-sized array is illegal

Pero igual gracias ese era mi error.

Rescrito bien:  template<class T, int N> Acumulador& operator+(Acumulador& c, T a[N])
 {
    for(int i=0;i<N; ++i) c += a[i];
    return c;
 }
Lo cual me compila perfectamente. No se por que me habia tarado con el "T[N] a" en vez del "T a[N]"

Igual no anda por que no puede deducir el parametro :( ... sigo investigando

int a[10];
c + a;


Gracias!







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.