c++0x: forma correcta de recibir un lambda como parámetro por referencia


¿Cuál es la forma correcta de definir una función que recibe un parámetro lambda int->int por referencia?

void f(std::function< int(int) >& lambda);

O

void f(auto& lambda);

No estoy seguro de que la última forma sea una sintaxis legal.

¿hay otras formas de definir un parámetro lambda?

Author: Alexis Wilke, 2011-06-23

2 answers

No puede tener un parámetro auto. Básicamente tienes dos opciones:

Opción #1: Use std::function como ha mostrado.

Opción # 2: Utilice un parámetro de plantilla:

template<typename F>
void f(F &lambda) { /* ... */}

La opción #2 puede, en algunos casos, ser más eficiente, ya que puede evitar una posible asignación de montón para el objeto de función lambda incrustado, pero solo es posible si f se puede colocar en un encabezado como una función de plantilla. También puede aumentar los tiempos de compilación y la huella de I-cache, al igual que cualquier plantilla. Tenga en cuenta que también puede no tener ningún efecto, ya que si el objeto de la función lambda es lo suficientemente pequeño puede representarse en línea en el objeto std::function.

 59
Author: bdonlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-24 02:42:48

Usaría template como:

template<typename Functor>
void f(Functor functor)
{
   cout << functor(10) << endl;
}

int g(int x)
{
    return x * x;
}
int main() 
{
    auto lambda = [] (int x) { cout << x * 50 << endl; return x * 100; };
    f(lambda); //pass lambda
    f(g);      //pass function 
}

Salida:

500
1000
100

Demo: http://www.ideone.com/EayVq

 24
Author: Nawaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-28 11:17:29