c++ - 如何使用 C++ lambda 将成员函数指针转换为普通函数指针以用作回调

标签 c++ lambda function-pointers pointer-to-member

我有一些代码需要 C 函数,但我想实例化一堆类实例并将该类的成员函数作为 C 函数传递。我需要同时捕获 N 个实例。我希望我能以 lambda 的形式做到这一点。

结果函数应该如下所示(大致):

// This is the code I want to interface with:

typedef void func(ParamClass param); // ParamClass is NOT my class

extern void notMyCode1(func funcArg); // Code I want to call, saves funcArg
extern void notMyCode2()  // uses saved funcArgs


// Here is the type of class I want to instantiate:

class MyClass {
   public:
       MyClass(int arg) : saveArg(arg) {}

       int saveArg;

   void myFunc(ParamClass param) {
       // uses saveArg and param to do the right action
   }

};

void useCase(void) {
   for (int i = 0; i < max; ++i) {
       MyClass myInstance(Myclass(i)); // maybe need vector to hold these?
       notMyCode1(myInstance.myFunc); // this code is what I don't know how to write
    }
    notMyCode2();
}

背景。我要调用的库是 Google Benchmark。 notMyCode1 是他们的基准注册函数。 notMyCode2 运行已注册的基准测试。 ParamClass 是他们的代码传递给基准测试的数据。

现在,通常情况下,人们将一个简单的 C 函数传递给注册代码,一个用于每个希望运行的基准测试。但是,我想一遍又一遍地运行相同的代码,用这个数字“i”对其进行参数化,并将每个“i”视为一个单独的基准。所以,我想在一个类中捕获“i”(或通过 lambda,但会产生多个 C 函数指针,每个指针中都绑定(bind)了“i”的值)。我尝试将“i”作为基准的参数并将其传递进去,但随后基准代码将“i”视为要总结的东西(我希望每个“i”都被视为具有不同参数的唯一基准用于统计待计算)。

这看起来应该很简单(它只是一个闭包),但我对函数指针(或 C++ lambda)不是很熟悉。如果是我的代码,我会直接传入类实例,但事实并非如此。

我在类中看到过使用静态函数的示例,但我特别想捕获“i”的值并获得多个函数指针,每个函数指针捕获不同的“i”值。

最佳答案

你不能。

如果 lambda 是无状态的(即没有捕获),它只能转换为函数指针。要从 lambda 调用成员函数,您需要一个指向用于调用成员函数的对象的指针。这是被捕获的,呈现 lambda 对象不可转换为简单的函数指针。

您可能拥有的唯一选择是在编译时使用模板进行索引参数化。然后您返回到使用可以作为 C 回调传递的类模板的简单静态函数。

关于c++ - 如何使用 C++ lambda 将成员函数指针转换为普通函数指针以用作回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56074551/

相关文章:

C++ 使用 boost::ptr_vector 泄漏内存

c++ - 特别是,创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?

接受谓词的 C# 方法 - 这看起来不错吗?

c++ - std::unordered_map - 使用 Lambda 专门化 KeyEqual

Javascript:尝试将函数设置为数组中对象的成员

Haskell FFI : Function pointer inside a struct

c++ - 如何设置在 Windows 上使用 CreateProcess 创建的新进程的主线程的堆栈大小?

c++ - unsigned char的减法运算

c# - 展平 Lambda 表达式以访问集合属性成员名称

c - 函数指针分配在堆上