【发布时间】:2018-01-17 23:51:03
【问题描述】:
有没有办法静态或动态地检测和/或检索 lambda 函数中捕获的值?
例如,用例:
randomFunction([this](){ methodCall(); });
这可能吗?
void randomFunction(std::function<void()> lambda) {
... // Detect if lambda capture is 'this'
MyClass* obj = /* retrieve lambda capture 'this' */;
...
}
假设 MyClass 是已知的,将始终相同,并且所有这些都发生在模板函数中。是否至少有一些特征/技巧可以根据 lambda 捕获来区分要调用哪个模板函数?
【问题讨论】:
-
从您的用例来看,您可能应该使用
void randomFunction(std::function<void(MyClass*)> lambda, MyClass* obj) -
你能得到
std::function的内容吗?是的。你能得到一个 lambda 的内容吗?没有。 -
当然有很多方法可以达到同样的效果。我只是发现
randomFunction(this, [this]{ methodCall(); });多余 -
std::function的全部目的是实现类型擦除。现在您要取消擦除已擦除的类型。无论你想做什么,你都需要正确地解决真正的问题,而不是试图弄清楚如何去做,你认为这是解决问题的方法。不是。
标签: c++ c++11 templates lambda