我有一些代码需要 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/