Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Pogacha en 17 de Diciembre de 2007, 06:14:28 PM

Título: Templatizar funciones para arrays?
Publicado por: Pogacha en 17 de Diciembre de 2007, 06:14:28 PM
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
Título: Templatizar funciones para arrays?
Publicado por: tamat en 17 de Diciembre de 2007, 06:17:35 PM
Jurl... eso de usar arrays de tamaño fijo como parametro nunca me ha molado.

Qué problema hay en pasar un std::vector ?
Título: Templatizar funciones para arrays?
Publicado por: Pogacha en 17 de Diciembre de 2007, 06:47:19 PM
Nínguno, pero quiero y necesito que me tome arrays también.
Título: Templatizar funciones para arrays?
Publicado por: ethernet en 17 de Diciembre de 2007, 07:47:45 PM
No es lo mismo que una referencia a un puntero? no entiendo bien la pregunta
Título: Templatizar funciones para arrays?
Publicado por: Pogacha en 17 de Diciembre de 2007, 08:38:18 PM
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ó.
Título: Templatizar funciones para arrays?
Publicado por: davur en 17 de Diciembre de 2007, 10:10:21 PM
Para que la función acepte arrays y no punteros:

template <class T, int N>
bar& foo(T (&a)[N])
{
   // ...
}
Título: Templatizar funciones para arrays?
Publicado por: Pogacha en 17 de Diciembre de 2007, 10:48:29 PM
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!
Título: Templatizar funciones para arrays?
Publicado por: Pogacha en 17 de Diciembre de 2007, 11:12:31 PM
http://www.codeguru.com/forum/showthread.php?t=350155&page=1&pp=15
http://www.velocityreviews.com/forums/t279736-p2-template-deduction-of-array-size.html


Entonces el problema es el compilador mio :(

Buscaré si hay alguna forma de arreglarlo.