c++ - 检测/获取 lambda 函数的捕获值

标签 c++ c++11 templates lambda

有没有办法静态或动态地检测和/或检索在 lambda 函数中捕获的值?

例如,对于用例:

randomFunction([this](){ methodCall(); });

这可能吗?

void randomFunction(std::function<void()> lambda) {
    ... // Detect if lambda capture is 'this'
    MyClass* obj = /* retrieve lambda capture 'this' */;
    ...
}

假设 MyClass 是已知的,将始终相同,并且所有这些都发生在模板函数中。是否至少有一些特征/技巧可以根据 lambda 捕获来区分调用哪个模板函数?

最佳答案

您已经捕获了 this,那么为什么不直接从 lambda 中返回它呢?如果相应的对象不再可访问,当然会出现困惑。

#include <iostream>
#include <functional>

class MyClass;

void randomFunction(std::function<MyClass*()> lambda)
{
  std::cout << __PRETTY_FUNCTION__ << '\n';
  MyClass* obj = lambda();
}

class MyClass
{
public:
  void methodCall()
  {
    std::cout << __PRETTY_FUNCTION__ << '\n';
  }

  void test()
  {
    std::cout << __PRETTY_FUNCTION__ << '\n';
    auto lambda = [this]() { methodCall(); return this; };
    randomFunction(lambda);
  }
};


int main()
{
  MyClass mc;
  mc.test();
}

Live example

关于c++ - 检测/获取 lambda 函数的捕获值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45601697/

相关文章:

php - 使用Twig显示PHP对象参数

c++ - Travis 和 Coverity Scan - 一切都在构建,但 coverity 似乎没有运行

c++ - 在 QML 代码中获取 Qt 版本的全局函数或宏

c++ - Windows 8 开发可以使用 native c++ 吗?

C++ - 在模板化函数指针参数调用中确定 foo 的实例

c++ - 在编译时获取 `std::initializer_list` 的大小

templates - Golang 模板(并将函数传递给模板)

c++ - VC++创建线程的方法

c++ - 重载解析 C 风格的字符串

c++ - 为什么使用 clang -std=gnu++11 时此 C++ 代码会编译?