通用std ::用于存储通用lambda的函数

时间:2018-12-18 08:04:44

标签: c++ lambda c++14 std-function generic-lambda

当通用lambda存储为std::function时,我们需要提供一个具体的类型,例如,

std::function<double(double)>

因此绑定到特定类型

以下声明:

std::function<auto(auto)>

引发编译器错误。

我了解到,从c ++ 14开始,auto可用于存储lambda的返回值,但是当在std::function中存储lambda时是否有实现此目的的方法? / p>

2 个答案:

答案 0 :(得分:3)

不能。甚至没有用自定义写std::function。这是类型擦除的基本限制。

直觉上,模板需要在函数调用时可用的类型信息,但是std::function中的类型擦除会破坏该信息。

在更详细的级别上,类型擦除通过在编译时以与类型无关的方式存储操作集来工作,无论是通过虚函数隐式还是通过函数指针隐式存储。模板实际上是一个无限的操作族,因此无法存储。

如果知道要使用的固定功能签名集,则可以编写自定义std::function

答案 1 :(得分:2)

你不能。

通用lambda和std::function是完全不同的东西。

您可以粗鲁地将auto(auto) lambda视为带有模板operator()的非模板类。

类似

struct myUnnamedLambdaStruct
 {
   // ...

   template <typename T>
   auto operator() (T t) const 
    { /* .... */ };
 };

与此相反,std::function():这是一个(非专业化的)模板类,带有一个非模板的operator()

template <typename>
class function;

template <typename RetType, typename ... ArgTypes>
class function<RetType(ArgTypes...)>
 {
   // a lot of other members/methods

   public:
      RetType operator() (ArgTypes ... args) const
       { /* .... */ }
 };

因此,一般的lambda对象不包含单个operator(),而是包含一组operator(),其中std::function对象包含单个operator()

您可以在std::function中“保存”通用lambda,但一次只能固定RetTypeArgTypes...。也就是说:在可用的operator()组中选择一个operator(),而忽略所有其他 void load_file_students(linked_student &students) { node_student *test = new node_student; ifstream stu_list("students.dat",ios::binary); stu_list.read((char*)test, sizeof(*test)); while (!stu_list.eof()) { //students.insert_node_list(test); students.insert_node_list(test); stu_list.read((char*)test, sizeof(*test)); } stu_list.close(); }