由此的链接我了解到,为了传递 lambda,我们需要将该方法作为参数传递并将其存储在 std::function 类型中。在这种情况下,是否可以从 lambda 的捕获列表中提取参数?
例子
struct foo
{
std::vector<int> t = {1,2,3};
};
void funct(std::function<void()> func)
{
func(); //This works fine . Can I extract the object foo from this lambda ?
}
int main()
{
foo a;
a.t.push_back(45);
funct( [a](){ std::cout << "New value is " << a.t[3] ; } );
}
Run Code Online (Sandbox Code Playgroud)
为了访问存储在std::function对象中的对象,必须使用std::function::target<T>模板函数。在本例中,T是您传递给 的构造函数的对象的实际类型function。
事实证明,lambda 的类型是不可类型化的。也就是说,该标准要求,无论编译器分配什么类型名,它都是您无法在键盘上输入的类型名。如果您还没有它(直接或通过对该类型的值进行类型推导),那么您无法获得它。
现在,你可以这样做:
template<typename T>
void funct(T func)
{
std::function<void()> stdfunc(func);
T *ptr_func = stdfunc.target<T>();
}
Run Code Online (Sandbox Code Playgroud)
当然,这是相当多余的,因为您已经有了 lambda 函数的类型。
然而,即使使用上面的代码,您也无法访问 lambda 的捕获变量。为什么?因为标准并没有说你可以。
您可以使用 lambda 闭包执行的操作的简短列表:
该实现不需要允许您访问 lambda 的成员变量。因此,没有标准的方法可以做到这一点。即使实现将它们公开并以它们在代码中的命名方式命名(这两者都不是必需的),C++ 标准也不保证每个实现都必须这样做。
| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |