Tengo una pregunta sobre C++ 0x lambdas. En mi código, sería beneficioso saber si un tipo determinado es del tipo de una expresión lambda de C++ 0x. Para dar un ejemplo:¿Es un rasgo de C++ is_lambda, puramente implementado como una biblioteca, imposible?
struct foobar
{
void operator()()
{
}
};
auto lambda = []{};
typedef is_lambda < decltype(lambda) > ::type T; // T would be a true_type
typedef is_lambda <foobar> ::type T; // T would be a false_type
Es bastante fácil distinguir las expresiones lambda de los tipos de función y miembro. Los funtores son otra cosa.
El problema que veo aquí es la definición de expresiones lambda según el próximo estándar C++ 0x; lo único que debe definirse es un operador de llamada pública. Sin embargo, esto también es cierto para un funtor; la prueba de la presencia del operador de llamada no es suficiente para distinguir las expresiones lambda de los funtores. Además, si el operador de un funtor es no presente, se producirá un error del compilador, ya que SFINAE no se aplica. ¿Cuándo sucede esto? El operador de llamada del operador puede ser modelado. Así, dicho código:
typedef decltype(&T::operator()) call_type;
va a trabajar para ambas expresiones lambda y funtores con operador de llamada no moldeado, y generar un error de compilación para los operadores de llamadas con plantilla.
Creo que un rasgo is_lambda < >
solo se puede crear utilizando las características del compilador intrínseco. ¿Ves una forma de implementar este rasgo?
Me pregunto para qué la usarías? –
Perdón por la respuesta tardía. Sí, creo que cometí un error lógico. No tiene sentido distinguir functors regulares de lambdas; puedo ver este último como el anterior. Sin embargo, existe la necesidad de determinar si existe o no un operador de llamada. Hasta la fecha, parece que no existe una solución completamente genérica para este problema. Trataré esto en una pregunta separada pronto, junto con mis intentos. –
@MaximYegorushkin: En cuanto a una diferencia motivadora: el tipo de * objeto de cierre * lo identifica de manera única. Lo mismo no es (necesariamente) verdadero para otros punteros a funciones u otros objetos funcionales. – BCS