Logo

¡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.
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.