![]() |
| |||||||
| Registrarse | Preguntas Frecuentes | Lista de Foreros | Calendario | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
| | LinkBack | Herramientas | Desplegado |
| |||
| 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. |
| | ||||
| ||||
| |
![]() |
| Herramientas | |
| Desplegado | |
| |