¿Cómo usar la expresión lambda como un parámetro de plantilla? P.ej. como una clase de comparación que inicializa un std :: set.¿Cómo usar una expresión lambda como parámetro de plantilla?
La siguiente solución debería funcionar, ya que la expresión lambda simplemente crea una estructura anónima, que debería ser apropiada como un parámetro de plantilla. Sin embargo, se generan muchos errores.
Código ejemplo:
struct A {int x; int y;};
std::set <A, [](const A lhs, const A &rhs) ->bool {
return lhs.x < rhs.x;
} > SetOfA;
salida de error (estoy usando g ++ 4.5.1 compilador y --std = C++ 0x bandera de compilación):
error: ‘lhs’ cannot appear in a constant-expression
error: ‘.’ cannot appear in a constant-expression
error: ‘rhs’ cannot appear in a constant-expression
error: ‘.’ cannot appear in a constant-expression
At global scope:
error: template argument 2 is invalid
es que el comportamiento esperado o un error en GCC?
EDITAR
Como alguien señaló, estoy usando expresiones lambda de forma incorrecta, ya que devuelven una instancia de la estructura anónima que se están refiriendo.
Sin embargo, corregir ese error no resuelve el problema. Consigo lambda-expression in unevaluated context
error para el siguiente código:
struct A {int x; int y;};
typedef decltype ([](const A lhs, const A &rhs) ->bool {
return lhs.x < rhs.x;
}) Comp;
std::set <A, Comp > SetOfA;
que este etiquetados como C++ 0x. Parece más apropiado y debería obtener mejores respuestas. – JoshD
@JoshD ¿No debería etiquetarse 'C++' también? 0x eventualmente se convertirá en el nuevo estándar y no me gustaría que la gente en el futuro se pierda esta pregunta porque olvidaron que la etiqueta adecuada era C++ 0x no C++. (O es tan va a migrar todas las etiquetas ++ C++ 0x a c en algún momento?) – KitsuneYMG