我有一个第三方库,我必须像这样分配函数指针:
FunctionsStruct functionsStruct;
functionsStruct.firstFunctionPointer = myFirstFunction;
functionsStruct.secondFunctionPointer = mySecondFunction;
functionsStruct.thirdFunctionPointer = ...;
在myFirstFunction、mySecondFunction中我使用了共享变量。它看起来像这样:
void myFirstFunction(int a, int b) {
sharedVariable = 56 * a;
...
}
void mySecondFunction(int c) {
sharedVariable = 21 + c;
...
}
我当然可以这样写一段代码:
int sharedVariable;
void myFirstFunction(int a, int b) {
sharedVariable = 56 * a;
...
}
void mySecondFunction(int c) {
sharedVariable = 21 + c;
...
}
void setFunctionPointers() {
FunctionsStruct functionsStruct;
functionsStruct.firstFunctionPointer = myFirstFunction;
functionsStruct.secondFunctionPointer = mySecondFunction;
functionsStruct.thirdFunctionPointer = ...;
}
但我想避免全局/静态变量+有类。
所以对我来说最好的是这样的(我知道我不能将成员函数地址分配给函数指针 - 我正在寻找类似的东西):
class A {
public:
A(int sharedVar): sharedVariable(sharedVar) {};
int sharedVariable {};
void myFirstFunction(int a, int b);
void mySecondFunction(int c);
}
class B {
private:
A a;
public:
B() {};
void setFunctionPointers();
}
void B::setFunctionPointers() {
functionsStruct.firstFunctionPointer = &a::myFirstFunction;
functionsStruct.secondFunctionPointer = &a::mySecondFunction;
functionsStruct.thirdFunctionPointer = ...;
}
那么最好的解决方案是什么?
您可以使用 lambda 进行捕获,这取决于您的自定义,但我假设您有一个 shared_ptr 变量,所以我只是通过复制(增加引用计数)来捕获它。
正如您所说,您可以使用全局(在这种情况下很丑陋)或类,并且以这种方式,您可以使用 lamda(与在皮肤下声明的类相同)。
struct FunctionsStruct {
std::function<void(int, int)> firstFunctionPointer;
std::function<void(int)> secondFunctionPointer;
};
void setFunctionPointers() {
FunctionsStruct functionsStruct;
auto sharedVariable = std::make_shared<int>();
functionsStruct.firstFunctionPointer =
[sharedVariable](int a, int b) -> void { *sharedVariable = 56 * a; };
functionsStruct.secondFunctionPointer = [sharedVariable](int c) -> void {
*sharedVariable = 21 + c;
};
}
int main() { return 0; }