有沒有辦法推導C++ 0x lambda的簽名,結果和參數類型作爲Boost.MPL序列,例如boost::mpl::vector
?例如,對於一個lambda有沒有一種方法可以推導lambda的簽名作爲mpl序列?
[](float a, int b) -> void { std::cout << a << b << std::endl; }
我想獲得一個boost::mpl::vector<void,float,int>
。
有沒有辦法推導C++ 0x lambda的簽名,結果和參數類型作爲Boost.MPL序列,例如boost::mpl::vector
?例如,對於一個lambda有沒有一種方法可以推導lambda的簽名作爲mpl序列?
[](float a, int b) -> void { std::cout << a << b << std::endl; }
我想獲得一個boost::mpl::vector<void,float,int>
。
作爲「閉包對象」的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, "");
}
可以重載若干功能如所描述in this answer to a similar question返回想要的類型。
良好的聯繫。也運作得很好,但提升方式絕對更短,更通用。 Upvote tho;) – ltjax 2010-12-21 08:34:57
我到底該怎麼做?我嘗試了函子本身和它的'operator()'上的parameter_types,result_type和components,但是我無法使它工作。 – ltjax 2010-12-19 13:09:34
示例的Thanx。我最終從parameter_types中彈出,並將result_type添加到前端 - 就像一個魅力! – ltjax 2010-12-21 08:33:39