Есть ли способ вывести сигнатуру лямбды в виде последовательности mpl? - PullRequest
6 голосов
/ 19 декабря 2010

Есть ли способ вывести сигнатуру, тип результата и тип параметра лямбды с ++ 0x как последовательность Boost.MPL, например, boost::mpl::vector? Например, для лямбды

[]( float a, int b ) -> void { std::cout << a << b << std::endl; }

Я бы хотел получить boost::mpl::vector<void,float,int>.

Ответы [ 2 ]

6 голосов
/ 19 декабря 2010

C ++ 0x лямбды, которые являются "объектами замыкания", являются функторами.Таким образом, вы можете использовать boost.Boost.FunctionTypes для разложения его operator().

Пример:

#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, "");
}
4 голосов
/ 19 декабря 2010

Можно перегрузить несколько функций, чтобы вернуть требуемый тип, как описано в этом ответе на аналогичный вопрос .

...