jueves, 1 de octubre de 2015

Expresión Lambda en C++11



Aquí dejo este pequeño detalle según las pruebas que he realizado con la expresión de tipo lambda de las librerías de C++11. La forma general es bastante simple, está conformada de tres partes,  la intermedia es inclusive opcional, haciéndola más simple aún,  como verán:



Introducer declaración(Opcional) cuerpo
•Forma1: [ ]      { }            //Sin parte declaración.
•Forma2: [ ] ( ) { }

Al menos esa es la forma general que conozco, no dudo que encuentren alguna por ahí con otra forma... les tocará googlear para salir de sus dudas. Yo de pronto he estado trabajando con la forma general que he mostrado lineas arriba, aqui dejo mas detalles:

▪ "[ ]" podria ser
    [ ]
    [&]
    [=]
    [variable]
    [&variable]
    [this]
    [&, variable, ...]
    [=, &variable, ...]

    Nota:
    ☆ '&' significa que captura por referencia todas las variables de su contexto.
    ☆ '=' similar al anterior pero por valor, o copia de las variables del co texto.

▪ "( )" podría ser:
    ( )
    (int param1, String param2, etc )
    Se puede indicar el retorno, Ej.:
    (int param1, String param2, etc ) -> void
    ( ) -> int

▪ "{ }" cuerpo del procedimiento, Ej.:
    {return param1 + param2}
   
EJEMPLO1:

1
2
3
4
 auto lambda = [this] (String pTitulo) -> void {
   this->Speedbutton1->Text = pTitulo;
 };
 lambda("Hola mundo");

Nota:
☆ 'auto' permite declarar las variables de manera automática, es decir que identifica el tipo de variable que debe autoasignarse dependiendo de qué se crea a su derecha. He tenido inconvenientes con cierto tipo de variables al usar este tipo de declaración en Android, al menos esto me pareció en las pruebas iniciales que he realizado; seguiré probando mas adelante.
☆ Éstas expresiones lambda son muy útiles para simplificar código, por ejemplo cuando pretendes hacer pequeñas funciones o métodos para objetos TThread. Muy recomendable!

EJEMPLO2:
1
2
3
4
5
6
7
8
9
 TTask::Run(
  [this]() -> void {
  Sleep(6000);
  int i = 7;
  TThread::Synchronize(0,
   [this, i]() -> void {
    ShowMessage(IntToStr(i));
   });
 });

EJEMPLO3:
1
2
3
4
5
6
7
fShowToast(u"'Por favor ingresar tu número de identificación",2);
TThread::CreateAnonymousThread([&]() -> void {
 Sleep(2000);
 TThread::Synchronize(TThread::CurrentThread, [&]()->void {
  edt_DocID->SetFocus();
 });
})->Start();