2011-07-09 12 views
5

Estoy trabajando en un pequeño proyecto de motor de gráficos que quiero que sea plataforma cruzada (algún día). Desarrollé con la última versión de MinGW y C++ 0x. Para los oyentes de eventos, utilizo las funciones lambda almacenadas en un std :: map que se invocará cuando ocurra un determinado evento. Funciona muy bien con MinGW, pero el otro día cuando lo probé en Visual Studio (última versión) falló.Tienda C++ 0x funciones lambda en std :: map/vector para uso posterior en Visual Studio

Inspeccioné el tipo de lambdas e incluso si defino que dos lambdas son exactamente iguales, obtienen diferentes tipos (espacio de nombre anónimo :: y espacio de nombre anónimo :).

Por ejemplo tengo este std :: mapa para almacenar los oyentes de desplazamiento

std::map<int,void (*)(int p)> scrollListenerFunctions; 

Y entonces puedo añadir un detector con sólo hacer:

addScrollListener([](int p){/* Do something here */}); 

Como ya he dicho, esto funciona bien en MinGW pero falla en Visual Studio, ¿hay alguna manera de hacerlo así que funciona en ambos y es incluso posible almacenar lambdas en VS atm?

Si wnat/necesidad de ver más código se puede encontrar aquí http://code.google.com/p/aotk/source/browse/ los mapas lambda se encuentran en window.h/window.cpp

Respuesta

7

en lugar de esto:

std::map<int,void (*)(int p)> scrollListenerFunctions; 

debe tener esto:

std::map<int,std::function<void(int p)> > scrollListenerFunctions; 

El problema es que una lambda no es convertible a un puntero a función. Necesita una envoltura de devolución de llamada más genérica, como std::function

+0

Muchas gracias. Lo tengo trabajando ahora. – Rickard

5

Las lambdas sin estado se pueden convertir a punteros a función pero Visual Studio aún no lo admite, se agregó después de que implementaron lambdas. De todos modos, deberías estar usando std::function.

+0

¿De verdad? No lo sabía. ¿Eso está en el borrador final? Pensé que una lambda es equivalente a una estructura con operador() en ella. Supongo que estaba equivocado :) –

+0

@Armen: Sí, la especificación C++ 0x más reciente tiene la capacidad de tener funciones lambda que capturen _nothing_ ser equivalentes a un puntero a la función. Esto se agregó cuando VC2010 estaba casi terminado, por lo que no lo implementó. –

+0

@Armen: Es, básicamente. Pero para las lambdas sin estado, entonces no hay ninguna razón para que no puedan ser equivalentes a una función gratuita. – Puppy

Cuestiones relacionadas