有没有办法将lambda的签名推断为mpl序列?

时间:2010-12-19 11:08:59

标签: c++ lambda c++11 metaprogramming boost-mpl

有没有办法将c ++ 0x lambda的签名,结果和参数类型推断为Boost.MPL序列,例如boost::mpl::vector?例如,对于lambda

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

我想获得boost::mpl::vector<void,float,int>

2 个答案:

答案 0 :(得分:6)

C ++ 0x lambdas是“闭包对象”是仿函数。因此,您可以使用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, "");
}

答案 1 :(得分:4)

您可以重载多个函数以按照in this answer to a similar question所述返回所需类型。