Newsgrupos.com  

Retroceder   Newsgrupos.com > Forum > Newsgroup es.comp.os.* Foro > Newsgroup es.comp.os.linux.programacion
Registrarse Preguntas Frecuentes Lista de Foreros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




Respuesta
 
LinkBack Herramientas Desplegado
  #1 (permalink)  
Antiguo 10-03-2008, 23:30:53
Pascal Bourguignon
 
Mensajes: n/a
Predeterminado Re: [C++] La misma función con distintos nombres(y comportamiento)

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.
Responder Con Cita
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Newsgrupos.com
Standard Sponsored Links

Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado






Powered by: vBulletin, Versión 3.6.8
Derechos de Autor ©2000 - 2008, Jelsoft Enterprises Ltd.

LinkBacks Enabled by vBSEO 3.1.0 © 2007, Crawlability, Inc.