c ++ 11 / 1y lambda函数的类型签名是什么?

天花

我想知道是否有一种标准方法来获取任何给定lambda参数的类型签名(即返回类型和类型)?

我问的原因是我一直想知道auto声明中的类型到底是什么auto l =[](int x,int y)->int{return x+y;}在的其他用例中auto,对于较长的类型名称,这是一种方便且较短的替代方法。但是对于lambda,甚至还有另一种方法来声明lambda变量吗?

我的理解是,标准的lambda仅仅是一个函数对象,而是它自己的类型。因此,即使两个lambda具有相同的返回类型和参数类型,它们仍然是两个不同的,不相关的类/函数。但这有没有办法捕捉到它们在类型签名方面相同的事实?

我认为我正在寻找的类型签名可能是std::function<>正确类型对象。

一个更有用/更有意义的问题是,如果可以提取类型签名,则可以编写一个通用包装函数,以将任何lambda函数转换为具有std::function相同类型签名对象。

天花

根据可以表达lambda表达式的“类型”吗?,实际上,当前的c ++(无需c ++ 1y)有一种简单的方法来计算lambda的return_type和参数类型。为此,为每个lambda组装一个std::function类型化的签名类型(f_type以下并不困难

I.使用这种抽象类型,实际上可能有一种替代方法来auto表示lambda的类型签名,即function_traits<..>::f_type下面的方法。注意:f_type并不是Lambda的真实类型,而是功能上Lambda类型签名的摘要。但是,它可能比lambda的实际类型有用,因为每个lambda都是自己的类型

如下代码所示,就像一个人可以使用vector<int>::iterator_type i = v.begin(),一个人也可以做function_traits<lambda>::f_type f = lambda,这是神秘方法的替代方法auto当然,这种相似只是形式上的。下面的代码涉及到将lambda转换为a std::function,这会浪费std::function对象构造类型的开销,而通过std::function对象进行间接调用的开销也很小但是这些std::function搁置使用的实现问题(我不认为这是根本性的,应该永远存在),毕竟,有可能明确表达任何给定lambda的(抽象)类型签名。

二。还可以编写一个make_function包装器(非常类似于std::make_pairstd::make_tuple),以将lambda f(以及其他可调用对象,如函数指针/函子)自动转换为std::function具有相同类型推断功能的。

测试代码如下:

#include <cstdlib>
#include <tuple>
#include <functional>
#include <iostream>
using namespace std;

// For generic types that are functors, delegate to its 'operator()'
template <typename T>
struct function_traits
    : public function_traits<decltype(&T::operator())>
{};

// for pointers to member function
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const> {
    //enum { arity = sizeof...(Args) };
    typedef function<ReturnType (Args...)> f_type;
};

// for pointers to member function
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) > {
    typedef function<ReturnType (Args...)> f_type;
};

// for function pointers
template <typename ReturnType, typename... Args>
struct function_traits<ReturnType (*)(Args...)>  {
  typedef function<ReturnType (Args...)> f_type;
};

template <typename L> 
typename function_traits<L>::f_type make_function(L l){
  return (typename function_traits<L>::f_type)(l);
}

long times10(int i) { return long(i*10); }

struct X {
  double operator () (float f, double d) { return d*f; } 
};

// test code
int main()
{
    auto lambda = [](int i) { return long(i*10); };
    typedef function_traits<decltype(lambda)> traits;
    traits::f_type ff = lambda;

    cout << make_function([](int i) { return long(i*10); })(2) << ", " << make_function(times10)(2) << ", " << ff(2) << endl;
    cout << make_function(X{})(2,3.0) << endl;

    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++ 11或C ++ 1y中对非类型模板参数包进行排序?

来自分类Dev

C ++:元组列表C ++ 11 / 1y

来自分类Dev

返回类型推导的类方法?C ++ 1y

来自分类Dev

CRTP和c ++ 1y返回类型推导

来自分类Dev

C ++ 1y自动功能类型推导

来自分类Dev

此递归多态C ++ 1y lambda调用有什么问题?

来自分类Dev

C ++ 1y / C ++ 14:将静态constexpr数组转换为非类型模板参数包?

来自分类Dev

C ++ 11中lambda函数的作用域是什么(代理)

来自分类Dev

C ++ 11中lambda函数的作用域是什么(代理)

来自分类Dev

C ++ 1y / 14:自动变量模板?

来自分类Dev

C ++ 1y的内存管理中的定型释放功能

来自分类Dev

在qt(mingw)中启用c ++ 1y

来自分类Dev

在C ++ 1y中,'constexpr'非静态成员函数不会隐式地成为'const';添加“ const”以避免行为改变

来自分类Dev

-O1 / 2/3,带有-std = c ++ 1y / 11/98-如果包含<cmath>,我会收到错误消息:在此范围内未声明'_hypot'

来自分类Dev

在C ++ 11中,“ auto var = {condition}?1:1.0”的类型是什么?是double还是int?

来自分类Dev

gcc编译选项std = c ++ 1y和std = c ++ 14之间的区别

来自分类Dev

c ++ 11下面的lambda函数的作用域是什么

来自分类Dev

在C ++ 1y中是否需要公共的类typedef?

来自分类Dev

C ++ 1y没有从std :: bind到std :: function的可行转换

来自分类Dev

C ++ 1y中的内存管理中的大小调整分配功能

来自分类Dev

为什么C11不支持Lambda函数

来自分类Dev

c ++ 1y将允许派生类对基类变量进行类内初始化吗?

来自分类Dev

C ++ 14 / 1y:“ operator +必须带有一个或两个参数”的标准引用?

来自分类Dev

C ++ 11对lambda返回类型的限制

来自分类Dev

C ++ 11函数参数

来自分类Dev

c ++ 11 lambda函数对象成员

来自分类Dev

C ++ 11 Lambda函数编译错误

来自分类Dev

C ++ 1y / C ++ 14:不允许在常量表达式中分配对象的生存期吗?

来自分类Dev

C ++ 1y / C ++ 14:不允许在常量表达式中分配对象的生存期吗?

Related 相关文章

  1. 1

    在C ++ 11或C ++ 1y中对非类型模板参数包进行排序?

  2. 2

    C ++:元组列表C ++ 11 / 1y

  3. 3

    返回类型推导的类方法?C ++ 1y

  4. 4

    CRTP和c ++ 1y返回类型推导

  5. 5

    C ++ 1y自动功能类型推导

  6. 6

    此递归多态C ++ 1y lambda调用有什么问题?

  7. 7

    C ++ 1y / C ++ 14:将静态constexpr数组转换为非类型模板参数包?

  8. 8

    C ++ 11中lambda函数的作用域是什么(代理)

  9. 9

    C ++ 11中lambda函数的作用域是什么(代理)

  10. 10

    C ++ 1y / 14:自动变量模板?

  11. 11

    C ++ 1y的内存管理中的定型释放功能

  12. 12

    在qt(mingw)中启用c ++ 1y

  13. 13

    在C ++ 1y中,'constexpr'非静态成员函数不会隐式地成为'const';添加“ const”以避免行为改变

  14. 14

    -O1 / 2/3,带有-std = c ++ 1y / 11/98-如果包含<cmath>,我会收到错误消息:在此范围内未声明'_hypot'

  15. 15

    在C ++ 11中,“ auto var = {condition}?1:1.0”的类型是什么?是double还是int?

  16. 16

    gcc编译选项std = c ++ 1y和std = c ++ 14之间的区别

  17. 17

    c ++ 11下面的lambda函数的作用域是什么

  18. 18

    在C ++ 1y中是否需要公共的类typedef?

  19. 19

    C ++ 1y没有从std :: bind到std :: function的可行转换

  20. 20

    C ++ 1y中的内存管理中的大小调整分配功能

  21. 21

    为什么C11不支持Lambda函数

  22. 22

    c ++ 1y将允许派生类对基类变量进行类内初始化吗?

  23. 23

    C ++ 14 / 1y:“ operator +必须带有一个或两个参数”的标准引用?

  24. 24

    C ++ 11对lambda返回类型的限制

  25. 25

    C ++ 11函数参数

  26. 26

    c ++ 11 lambda函数对象成员

  27. 27

    C ++ 11 Lambda函数编译错误

  28. 28

    C ++ 1y / C ++ 14:不允许在常量表达式中分配对象的生存期吗?

  29. 29

    C ++ 1y / C ++ 14:不允许在常量表达式中分配对象的生存期吗?

热门标签

归档