首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有可能弄清楚lambda的参数类型和返回类型?

有没有可能弄清楚lambda的参数类型和返回类型?
EN

Stack Overflow用户
提问于 2011-10-30 13:47:17
回答 2查看 31.8K关注 0票数 141

给定一个lambda,可以确定它的参数类型和返回类型吗?如果是,是如何实现的?

基本上,我想要lambda_traits,它可以通过以下方式使用:

auto lambda = [](int i) { return long(i*10); };

lambda_traits<decltype(lambda)>::param_type  i; //i should be int
lambda_traits<decltype(lambda)>::return_type l; //l should be long

背后的动机是,我想在接受lambda作为参数的函数模板中使用lambda_traits,并且我需要知道它的参数类型和函数内部的返回类型:

template<typename TLambda>
void f(TLambda lambda)
{
   typedef typename lambda_traits<TLambda>::param_type  P;
   typedef typename lambda_traits<TLambda>::return_type R;

   std::function<R(P)> fun = lambda; //I want to do this!
   //...
}

目前,我们可以假设lambda只有一个参数。

最初,我尝试使用std::function作为:

template<typename T>
A<T> f(std::function<bool(T)> fun)
{
   return A<T>(fun);
}

f([](int){return true;}); //error

但它显然会产生错误。因此,我将其更改为函数模板的TLambda版本,并希望在函数内部构造std::function对象(如上所示)。

EN

回答 2

Stack Overflow用户

发布于 2011-10-30 15:17:41

虽然我不确定这是否严格符合标准,但ideone编译了以下代码:

template< class > struct mem_type;

template< class C, class T > struct mem_type< T C::* > {
  typedef T type;
};

template< class T > struct lambda_func_type {
  typedef typename mem_type< decltype( &T::operator() ) >::type type;
};

int main() {
  auto l = [](int i) { return long(i); };
  typedef lambda_func_type< decltype(l) >::type T;
  static_assert( std::is_same< T, long( int )const >::value, "" );
}

但是,这只提供了函数类型,因此必须从中提取结果和参数类型。如果你能使用boost::function_traitsresult_typearg1_type就可以满足你的需求。由于ideone似乎不能在C++11模式下提供boost,所以我无法发布实际的代码,抱歉。

票数 12
EN

Stack Overflow用户

发布于 2018-05-10 18:28:35

@KennyTMs提供的答案效果很好,但是如果lambda没有参数,使用索引arg<0>就不能编译。如果其他人遇到这个问题,我有一个简单的解决方案(比使用SFINAE相关的解决方案更简单)。

只需在arg结构中的变量参数类型后面添加void到元组的末尾即可。即

template <size_t i>
    struct arg
    {
        typedef typename std::tuple_element<i, std::tuple<Args...,void>>::type type;
    };

因为数量不依赖于模板参数的实际数量,所以实际数量不会不正确,如果它是0,那么至少arg<0>仍然存在,您可以随心所欲地使用它。如果您已经计划不超过索引arg<arity-1>,那么它不应该干扰您当前的实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7943525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档