¿Cómo hago para crear una funcion que al usarla cree otra?.

Iniciado por josue9243, 3 Noviembre 2017, 17:41 PM

0 Miembros y 2 Visitantes están viendo este tema.

josue9243

Como hago tipo, pongo en .h esto:


int Function( int a )
{
         return a+5;
}


y Cada vez que lo utilize en un .cpp o en cualquier lado se cree una funcion con eso.

PERO NO INSERTARLO CORTE INLINE, sino que como que copia la funcion y la clona SÓLO PARA ESE USO EJEMPLO:


int roberto( int hola, int param )
{
          int a, b, c, d (?
          Function( 4 );
         blabla...
          Function( a + 10 );
}


y para cada vez que uso Function se clona sólo para ese uso en este caso se clona 2 veces.

Habia un XorStr de 007 Boy Scout que hacia eso con xorstr.

ivancea96

La idea de una función es reutilizarla. ¿Por qué "clonarla"?
¿Hablas de tener otra función en memoria idéntica por cada uso?

¿Por qué necesitas esto?

josue9243

Cita de: ivancea96 en  4 Noviembre 2017, 00:00 AM
La idea de una función es reutilizarla. ¿Por qué "clonarla"?
¿Hablas de tener otra función en memoria idéntica por cada uso?

¿Por qué necesitas esto?

¿Porque tanta curiosidad? :v jajaja

Necesito eso porque si en IDA Pro algun vivo me reemplaza

sub_12933942 por CortarPapas();

se reemplaza en TODO el programa, entonces si hago que CortarPapas(); cada vez que lo utilizo se duplique clone o como quieran decirle.

entonces aparece

sub_239429349
sub_283474574
sub_192392939

:p xD

CalgaryCorpus

Se me ocurre una manera de hacerlo, pero no es tan directo como llegar e invocar una funcion. En C++, los templates generan codigo y cada especializacion es codigo distinto.
De esta manera, basta que uses una especializacion cada vez que invocas la funcion.

Ejemplo:
Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

template <int N> void myfunc1() {  cout << N << endl; }

template <int N> void myfunc2() {  cout << "No me importa el valor de N" << endl;  }

int main()
{
    // Invocar una funcion a la que le interesa usar el valor explicito
    // todas las funciones son distintas
    myfunc1<1>();
    myfunc1<456>();
   
    // Invocar una funcion en que el parametro del template se ignora
    myfunc2<1234>();

    return 0;
}


Puedes ver este codigo ejecutandose en este link:  http://goo.gl/x3aJ9X

No puedes usar variables como parametro de la especializacion. Solo constantes explicitas.

Aqui mi perfil en LinkedIn, invitame un cafe aqui

josue9243

Jajaja si es igual que el otro código, y si se pueden usar parametros porque el XorStr del otro lo utiliza xD.

XorStr< int a1, int a2, int a3>XorStr( string );

CalgaryCorpus

#5
No dije que no se pueden usar parámetros.
Dije que no se pueden usar variables como parámetros de la especialización.

Vale decir, no puedes usar

mifunc<i>()

Solo puedes usar constantes, como en el ejemplo que mande

Yo no tengo a la vista el xorstr que mencionas.
Aqui mi perfil en LinkedIn, invitame un cafe aqui