Thread View: es.comp.os.linux.programacion
7 messages
7 total messages
Started by Han Solo
Mon, 10 Mar 2008 16:52
[C++] La misma función con distintos nombres (y comportamiento)
Author: Han Solo
Date: Mon, 10 Mar 2008 16:52
Date: Mon, 10 Mar 2008 16:52
27 lines
2965 bytes
2965 bytes
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hola a todos. Una duda que tengo y que lo mismo es una gilipollez, pero bueno. ¿es posible tener una función definida con dos nombres diferentes, y que que desde dentro se sepa con qué nombre ha sido llamada? La idea es que se comportara como los enlaces a ficheros del sistema operativo; se puede hacer un enlace al programa, y argv[0] contiene el nombre con el que ha sido llamado. La idea es que tengo programada una función que devuelve un determinado objeto. Tengo que programar otra, que utiliza los mismos parámetros de entrada, los mismos valores intermedios, y devuelve el mismo tipo de objeto, aunque la última operación interna con los valores intermedios es diferente. Ya sé que lo elegante sería sacar la parte común a otra función/funciones (y es lo que acabaré haciendo), pero con el tipo de datos intermedios que manejo es un poco latoso, y prefiero avanzar más rápido ahora mismo. ¿se puede? ¿no se puede? ¿es una guarrería? Un Saludo - -- Han Solo The Rebel Alliance Emacs is not on every system So what? [...] Do you tell your administrative people to stick with notepad.exe? Do you tell your fat kids they can only have the crummy games that come with their video games or plain dress that comes with Barbie? -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQFH1WdB4FjpJaPEp20RAjfOAKDPkTqvWapNuIpGcQwgbXC+n7vn7ACbBqo6 GDQ4VzbjOW+JMRrDD6PawPo= =RTkt -----END PGP SIGNATURE-----
Re: [C++] La misma función con distintos nombres (y comportamiento)
Author: iarenaza
Date: Mon, 10 Mar 2008 22:06
Date: Mon, 10 Mar 2008 22:06
24 lines
1880 bytes
1880 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
>>>>> "Han" == Han Solo <hsolo@escomposlinux.org> writes:
Han> �se puede? �no se puede? �es una guarrer�a?
Con el C++ que yo conozco (que puede ser un poco vetusto, ya que no le
he seguido la pista a los nuevos est�ndares desde hace a�os), no se
puede.
Saludos. I�aki.
- --
Get PGP/GPG Keys at http://www.escomposlinux.org/iarenaza/pgpkey.php
I use free software / Yo uso software libre
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.8+ <http://mailcrypt.sourceforge.net/>
iD8DBQFH1bDXZXLnGT1HLgcRAj4dAJ4tlJc/C6+rxt7qIWe+tQRjb1PKtwCeJ2lL
DJqO/2dXBVVSR2EyK7i3iLE=
=e4cm
-----END PGP SIGNATURE-----
Re: [C++] La misma función con distintos nombres (y comportamiento)
Author: Pascal Bourguignon
Date: Tue, 11 Mar 2008 00:30
Date: Tue, 11 Mar 2008 00:30
134 lines
4536 bytes
4536 bytes
Han Solo <hsolo@escomposlinux.org> writes:
> Hola a todos.
>
> Una duda que tengo y que lo mismo es una gilipollez, pero bueno.
>
> �es posible tener una funci�n definida con dos nombres diferentes, y que
> que desde dentro se sepa con qu� nombre ha sido llamada? La idea es que
> se comportara como los enlaces a ficheros del sistema operativo; se
> puede hacer un enlace al programa, y argv[0] contiene el nombre con el
> que ha sido llamado.
>
> �se puede? �no se puede? �es una guarrer�a?
Por supuesto, todo se puede.
Primiero, lo basico:
#include <iostream>
using namespace std;
int f(int x){
return(2*x);
}
typedef int(*Fun)(int);
Fun g=f;
int main(void){
cout<<f(3)<<endl;
cout<<g(3)<<endl;
return(0);
}
/*
-*- mode: compilation; default-directory: "/tmp/" -*-
Compilation started at Tue Mar 11 01:20:42
g++ -o ejemplo ejemplo.c++ && ./ejemplo
6
6
Compilation finished at Tue Mar 11 01:20:43
*/
Luego, si quieres saber el nombre por lo cual la funcion esta llamada,
hay m�s trabajo:
#include <iostream>
using namespace std;
int f(const char* myname,int x){
cout<<"called as "<<myname<<endl;
return(2*x);
}
int g(int x){ return(f("g",x)); }
int h(int x){ return(f("h",x)); }
int main(void){
cout<<g(3)<<endl;
cout<<h(3)<<endl;
return(0);
}
/*
-*- mode: compilation; default-directory: "/tmp/" -*-
Compilation started at Tue Mar 11 01:23:19
g++ -o ejemplo ejemplo.c++ && ./ejemplo
called as g
6
called as h
6
Compilation finished at Tue Mar 11 01:23:20
*/
Se puede simplificar algo, con templates, pero seria bastante
complicado escribir esos templates...
> La idea es que tengo programada una funci�n que devuelve un
> determinado objeto. Tengo que programar otra, que utiliza los mismos
> par�metros de entrada, los mismos valores intermedios, y devuelve el
> mismo tipo de objeto, aunque la �ltima operaci�n interna con los
> valores intermedios es diferente.
Pues entonces pasa una funci�n como parametro, para hacer este �ltimo
tratamiento:
#include <iostream>
using namespace std;
typedef int(*Fun)(int);
int f(int x,Fun ultimo){
return(ultimo(2*x));
}
int g(int x){ return(1+x); }
int h(int x){ return(x/3); }
int main(void){
cout<<f(3,g)<<endl;
cout<<f(3,h)<<endl;
return(0);
}
/*
-*- mode: compilation; default-directory: "/tmp/" -*-
Compilation started at Tue Mar 11 01:27:02
g++ -o ejemplo ejemplo.c++ && ./ejemplo
7
2
Compilation finished at Tue Mar 11 01:27:03
*/
> Ya s� que lo elegante ser�a sacar la parte com�n a otra
> funci�n/funciones (y es lo que acabar� haciendo), pero con el tipo de
> datos intermedios que manejo es un poco latoso, y prefiero avanzar m�s
> r�pido ahora mismo.
--
__Pascal Bourguignon__ http://www.informatimago.com/
READ THIS BEFORE OPENING PACKAGE: According to certain suggested
versions of the Grand Unified Theory, the primary particles
constituting this product may decay to nothingness within the next
four hundred million years.
Re: [C++] La misma funci�n con distintos nombres (y comportamiento)
Author: Pedro Maicas
Date: Wed, 12 Mar 2008 19:02
Date: Wed, 12 Mar 2008 19:02
26 lines
1984 bytes
1984 bytes
On Mon, 10 Mar 2008 17:52:15 +0100, Han Solo <hsolo@escomposlinux.org> wrote: >Una duda que tengo y que lo mismo es una gilipollez, pero bueno. Lo que tienes que hacer a�adir un par�metro a la funcion, un booleano servir�, a�adir la parte que ya pensabas a�adir ( if(el_boleano) .... ) y con eso tienes una funcion nueva, que hace lo mismo que la antigua pero que se desdobla en dos seg�n un nuevo par�metro. A�ades ahora dos nuevas funciones que llaman a la anterior (tres lineas de c�digo para cada una). En unos diez segundos lo tienes solucionado. Contestar directamente la pregunta sobre "si se puede ...." me parece absurdo, pues el nombre de la funcion es uno y solo uno, adem�s solo existe antes de ser compliada la funcion, luego no existe un nombre (mucho menos dos). Saludos :-) -Pedro- http://www.maicas.net/ e-mail en www.maicas.net
Re: [C++] La misma función con distintos nombres (y comportamiento)
Author: Gonzalo Pérez de Olaguer Córdoba
Date: Thu, 13 Mar 2008 10:33
Date: Thu, 13 Mar 2008 10:33
27 lines
2128 bytes
2128 bytes
Hola Han Solo <hsolo@escomposlinux.org>
el Thu, 13 Mar 2008 11:01:47 +0100 escribiste:
> Pues no es tan sencillo. El problema de hacerlo así (que ya lo había
> contemplado) es que tengo que cambiar la llamada a la primera
> función en todos los sitios en que ya está programada. En este caso
> concreto, tampoco es tan complicado, pero me interesaba saber si se
> podía hacer de otra forma.
¿No puedes usar defines para implementar los cambios? Algo así:
#define funcion_antigua(...) funcion_nueva(0,#args)
#define la_otra_funcion_antigua(...) funcion_nueva(1,#args)
void funcion_nueva (int flag, ...)
{
// parte común
if (flag) {
// sólo para la_otra_funcion_antigua
} else {
// sólo para funcion_antigua
}
}
--
Gonzalo Pérez de Olaguer Córdoba <gpoc@iies.es>
PGP key 2861C704 --- F206 5671 6789 425D 111C 1302 214F 1934 2861 C704
Re: [C++] La misma función con distintos nombres (y comportamiento)
Author: Han Solo
Date: Thu, 13 Mar 2008 14:55
Date: Thu, 13 Mar 2008 14:55
22 lines
2715 bytes
2715 bytes
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 El Thu, 13 Mar 2008 11:33:00 +0100 Gonzalo Pérez de Olaguer Córdoba <gpoc@iies.es> escribió: > Hola Han Solo <hsolo@escomposlinux.org> > el Thu, 13 Mar 2008 11:01:47 +0100 escribiste: > > > Pues no es tan sencillo. El problema de hacerlo así (que ya lo había > > contemplado) es que tengo que cambiar la llamada a la primera > > función en todos los sitios en que ya está programada. En este caso > > concreto, tampoco es tan complicado, pero me interesaba saber si se > > podía hacer de otra forma. > > ¿No puedes usar defines para implementar los cambios? Algo así: > Pues mira, eso no se me había ocurrido. Es otra idea. Muchas gracias. - -- Un Saludo Han Solo The Rebel Alliance Emacs is not on every system So what? [...] Do you tell your administrative people to stick with notepad.exe? Do you tell your fat kids they can only have the crummy games that come with their video games or plain dress that comes with Barbie? -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQFH2UBY4FjpJaPEp20RApE+AJ9Uxn71Ih9sCYSd+T/PU7CYJkVDggCZAaXw KCHf8d6NCYFc81ZeZauWTJs= =sP+p -----END PGP SIGNATURE-----
Re: [C++] La misma funci�n con distintos nombres (y comportamiento)
Author: Pedro Maicas
Date: Thu, 13 Mar 2008 19:11
Date: Thu, 13 Mar 2008 19:11
71 lines
2904 bytes
2904 bytes
On Thu, 13 Mar 2008 15:55:18 +0100, Han Solo <hsolo@escomposlinux.org> wrote:
>Pues mira, eso no se me hab�a ocurrido. Es otra idea.
Si tienes una funcion:
void pepito(int a, int b)
{
...........
}
Y quieres a�adir un par�metro, no necesitas cambiar las llamadas,
puedes a la vez cambiar el nombre:
void pepito_nueva(int a, int b, int selector)
{
........... (esto ni lo toco)
}
En tres segundos tienes la nueva funcion, y no necesitas cambiar
los nombres de las llamadas.
Ahora tienes que a�adir dos funciones,
void pepito(int a, int b)
{
pepito_nueva(a, b, true);
}
void juanito(int a, int b)
{
pepito_nueva(a, b, false);
}
En otros cinco segundos solucionado.
Claro que puedes usar un #define si no quieres tocar el
nombre de la funcion. O bien, si usas C++ no toques
el nombre de la funcion ni uses #define porque con a�adir
un par�metro ya basta para que el compilador la distinga de
la original. Y tambie con C++, las dos funciones que
enmascaran la otra pueden ser declaradas 'inline', y
con eso tienes lo m�s parecido a lo que preguntabas que se
puede conseguir.
La solucion de Pascal, no me creo que la vayas a usar :-)
Resumiendo en C++:
//funcion original con otro par�metro
void pepito(int a, int b, int selector);
//dos funciones que llaman a la anterior
inline void pepito(int a, int b)
{
pepito(a, b, true);
}
inline void juanito(int a, int b)
{
pepito(a, b, false);
}
Saludos :-) -Pedro-
http://www.maicas.net/
e-mail en www.maicas.net
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads