c++ - sintaxis - lambda c# tutorial
¿Hay alguna forma de deducir la firma de un lambda como una secuencia mpl? (2)
¿Hay alguna forma de deducir los tipos de firma, resultado y parámetro de un c ++ 0x lambda como una secuencia Boost.MPL, por ejemplo un boost::mpl::vector
? Por ejemplo, para una lambda
[]( float a, int b ) -> void { std::cout << a << b << std::endl; }
Me gustaría obtener un boost::mpl::vector<void,float,int>
.
C ++ 0x lambdas que son "objetos de cierre" son funtores. Entonces puedes usar boost.Boost.FunctionTypes para descomponer su operator()
.
Ejemplo:
#include <boost/function_types/parameter_types.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/int.hpp>
int main()
{
int x = 1;
auto f = [x](char a, short b, int c){ return x; };
typedef decltype(f) lambda_t;
typedef boost::function_types::parameter_types<
decltype(&lambda_t::operator())>::type args_t;
// we can use boost::mpl::identity<decltype(f)>::type instead of lambda_t
static_assert(sizeof(boost::mpl::at<args_t, boost::mpl::int_<1>>::type) == 1, "");
}
Puede sobrecargar varias funciones para devolver el tipo deseado como se describe en esta respuesta a una pregunta similar .