当通用lambda存储为std::function
时,我们需要提供一个具体的类型,例如,
std::function<double(double)>
因此绑定到特定类型
以下声明:
std::function<auto(auto)>
引发编译器错误。
我了解到,从c ++ 14开始,auto
可用于存储lambda的返回值,但是当在std::function
中存储lambda时是否有实现此目的的方法? / p>
答案 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,但一次只能固定RetType
和ArgTypes...
。也就是说:在可用的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();
}
。