我有一些需要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回调传递。