2011-07-24 15 views
8

Tengo 8 años de experiencia en la codificación, pero nunca he visto el operador [] pasado como parámetro a la definición de la función.Sintaxis extraña de C++

Por ejemplo, el código siguiente (a partir de un proyecto de código abierto):

bree::porder(m_root, [] (treenode* node) { delete node; }); 

A lo largo de mi vida de codificación, siempre he definido como un [] overloader operador, no como un parámetro.

Entonces, ¿qué significa esta nueva sintaxis?

Estoy utilizando el compilador que viene con Visual Studio 2003. ¿Cómo puedo cambiar el código anterior para que se compile en VS 2003?

+0

(http://www.codeproject.com/KB/cpp/cpp10.aspx) – Ajay

Respuesta

16

Que es un C++ lambda puede reemplazar el código con un objeto de función de la misma definición. El enlace muestra dos ejemplos uno usando Functor y el otro usando un lambda.

+0

Así lambda las funciones llegan a C++ ... interesante. No puedo decir que la sintaxis sea particularmente bonita o comprensible a través de – crasic

+0

Sí, y [son (al menos parcialmente) compatibles con Visual Studio 2010] (http://stackoverflow.com/questions/4855153/visual-c-anonymous-methods) Buena razón para actualizar los compiladores ahora; 2003 se está poniendo muy largo en el diente. –

+1

@crasic: la sintaxis (al menos de los []) es inevitable, porque debe poder especificar si captura cada variable por referencia o valor. (Si todo estuviera implícitamente por referencia, se encontraría con todo tipo de problemas ya que su lambda contiene referencias a objetos que pueden haber salido del alcance cuando invocó la lambda – jalf

5

Como otras respuestas han mencionado, su marca una nueva sintaxis para apoyar 0x C++ lambas. No es compatible con ninguna versión de Visual Studio anterior a VS 2010, por lo que para que ese fragmento de código funcione en VS 2003, deberá volver a configurar el código para usar una función o un objeto de objeto.

creo que algo como lo siguiente podría funcionar para usted: [. Una mejor lectura]

// somewhere where it would be syntactically valid to 
// define a function 
void treenode_deleter(treenode* node) 
{ 
    delete node; 
} 


// ... 

bree::porder(m_root, treenode_deleter); 
Cuestiones relacionadas