2010-09-01 19 views
8

¿Hay algún problema con la implementación de tal cierre (robado de python hack)?C++ closure hack

void function(int value) { 
    struct closure { 
     closure(int v = value) : value_(value) {} 
     private: int value_; 
    }; 
    closure c; 
} 

Sobre la investigación adicional, aparece en funciones miembro, las variables locales no se pueden utilizar como valores por defecto, pero las variables de objeto pueden.

+0

Eso es lo que hace la mayoría de los otros lenguajes entre bastidores cuando captura una variable local con una función local. Por ejemplo, descompile el código C# utilizando delegados anónimos y variables capturadas. –

+2

Necesita pasarle valor al constructor explícitamente: el argumento predeterminado de una función no puede ser una variable local. Esa regla es para todas las funciones, no solo para las funciones miembro. –

+0

@James, gracias, no conocía muy bien las reglas – Anycorn

Respuesta

6

Parece una buena base para realizar un cierre. Más un modismo que un truco, ya que legítimamente estás usando las características del lenguaje para su propósito previsto.

Por supuesto, su ejemplo no hace nada. Y solo puede usarse dentro de function.

Gratuito C++ 0x enchufe:

#include <functional> 

void some_function(int x) { } 

void function(int value) { 
    struct closure { 
     std::function< void() > operator()(int value) 
      { return [=](){ some_function(value); }; } 
    }; 

    auto a = closure()(value); 
    auto b = closure()(5); 

    a(); 
    b(); 
    b(); 
} 
+0

, acabo de publicar una muestra corta para dar idea – Anycorn

+0

, uno de estos meses, creo que necesito empezar a usar 0x – Anycorn

6

El C++ equivalente de un cierre:

class Closure 
{ 
    public: 
     Closure(std::string const& g) 
      :greet(g) 
     {} 
     void operator()(std::string const& g2) 
     { 
      std::cout << greet << " " << g2; 
     } 
    private: 
     std::string greet; 
}; 

int main() 
{ 
    Closure c("Hello"); 

    c("World"); // C acts like a function with state. Whooo. 
} 

Con la nueva sintaxis lambda en C++ 11 se hace aún más fácil.

int main() 
{ 
    std::string g("Hello"); 

    auto c = [g](std::string const& m) {std::cout << g << " " << m;}; 

    c("World"); 
} 

Con la nueva sintaxis lambda extendida en C++ 14 (-std = C++ 1a en gcc) se hace aún más fácil.

int main() 
{ 
    auto c = [g="Hello"](std::string const& m) {std::cout << g << " " << m;}; 

    c("World"); 
} 
+0

Gran ejemplo fácil de obtener, (+) – Wolf

+0

@ Wolf: Actualizado con C++ 11 –