🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #422

Re: [C++] La misma función con distintos nombres (y comportamiento)

#422
From: Pascal Bourguignon
Date: Tue, 11 Mar 2008 00:30
134 lines
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.
Technical Details
Message-ID: <87lk4qxfsy.fsf@thalassa.informatimago.com>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
References: <20080310175215.278cae58@tatooine>

Show Full Headers
Complete Article Headers
X-Google-Thread: f86c8,d11cae33929ec158
X-Google-Attributes: gidf86c8,public,usenet
X-Google-Language: SPANISH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From: Pascal Bourguignon <pjb@informatimago.com>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: [C++] La misma función con distintos nombres
 (y comportamiento)
Date: Tue, 11 Mar 2008 01:30:53 +0100
Organization: Informatimago
Lines: 134
Message-ID: <87lk4qxfsy.fsf@thalassa.informatimago.com>
References: <20080310175215.278cae58@tatooine>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: individual.net VYp03VohvKcKPfMeBVKqQgyToIBGCnNob3Jy09gOMaZjMKx/qq
Cancel-Lock: sha1:MDg0NzBmMmMzOTQ4NWMyNjA5ZTMwMDNkZWVkYzEwMzQ2MzJiYjJiOQ== sha1:RI8iemR6YqZHQxqHtBXCtv0/agA=
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA
      oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9
      033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac
      l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR
      mV+hO/VvFAAAAABJRU5ErkJggg==
X-Accept-Language:         fr, es, en
X-Disabled: X-No-Archive: no
User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (gnu/linux)