如何使用C lambda将成员功能指针转换为普通功能指针,以用作回调

How to use a C++ lambda to convert a member function pointer to a normal function pointer for use as a callback

本文关键字:功能 指针 回调 转换 何使用 lambda 成员      更新时间:2023-10-16

我有一些需要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基准。NotMyCode1是他们的基准注册函数。NotMyCode2运行注册的基准。ParamClass是数据,他们的代码传递到基准测试中。

现在,通常,一个简单的C函数将一个简单的C函数传递给注册代码,每个基准都希望运行。但是,我想通过此数字" i"一遍又一遍地运行相同的代码,并将每个代码视为单独的基准。因此,我想在班级中捕获"我"(或通过lambda,但可以使我产生多个C函数指针具有每个绑定的" i"的值(。我尝试将" i"作为基准的参数并将其传递给,但是然后将基准代码视为要概括的" i"(我希望每个" i"被视为具有统计信息不同参数的独特基准测试要计算(。

这似乎应该很容易做到(这只是一个封闭(,但我对函数指针(或C lambdas(的熟悉程度不高。如果是我的代码,我只会通过类实例,但不是。

我已经看到了类中使用静态函数的示例,但是我特别想捕获" i"的值并获得多个函数指针,每个指针都捕获了" i"的不同值。

<</p>

你不能。

如果lambda无状态(即没有捕获(,则仅具有函数指针的转换。要从lambda调用成员函数,您需要一个指向对象调用成员函数的指针。这是捕获的,渲染lambda对象不转换为简单功能指针。

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