dsp*_*ser 3 c++ function-pointers
我想知道标准 C++ 中是否有一种方法(似乎不支持这种方法,但也许我没有仔细看)来声明指向具有相同签名的任何类成员函数的指针。例如,X 和 Y 具有具有相同签名的 echoX 和 echoY 方法
\n\nclass X{\n\xc2\xa0 int val;\npublic:\n\xc2\xa0int echoX(int v)\xc2\xa0 {\n\xc2\xa0val = v;\n\xc2\xa0return v; }\n\xc2\xa0 \xc2\xa0int getValue() const { return val; }\n};\n\nclass Y{\n\n\xc2\xa0 \xc2\xa0int val;\n\xc2\xa0 \xc2\xa0public:\n\xc2\xa0 \xc2\xa0int echoY(int v)\xc2\xa0 {\n\xc2\xa0 \xc2\xa0val = v;\n\xc2\xa0 \xc2\xa0return v;\n\xc2\xa0 \xc2\xa0}\n\xc2\xa0 \xc2\xa0int getValue() const { return val; }\n};\nRun Code Online (Sandbox Code Playgroud)\n\n一些 C++ 实现通过扩展允许此功能(例如,VCL 使用关键字__closure)。
typedef int (__closure *IntFunPtr)(int);\nRun Code Online (Sandbox Code Playgroud)\n\n现在,编写一个能够调用 或 的函数很X::echoX简单Y::echoY
void CallObjectMethod(IntFunPtr fPtr, int val){\n\n fPtr(val);//this can call any member method that accepts an int and returns an int\n}\n\n\nX x, x1;\nCallObjectMethod(&x.echoX,4);\nCallObjectMethod(&x1.echoX,20);\n\nY y, y1;\nCallObjectMethod(&y.echoY,10);\nCallObjectMethod(&y1.echoY,15);\nRun Code Online (Sandbox Code Playgroud)\n\n此功能对于实现事件处理程序等非常有用。
\n\n谢谢
\n“例如,X 和 Y 具有具有相同签名的 echoX 和 echoY 方法”
据我所知,它们没有相同的签名,它们对类实例有一个隐式的第一个参数。通常你会选择 anstd::function来摆脱第一个参数。
#include <functional>
class X { public: int echoX(int v) {return v; } };
class Y { public: int echoY(int v) {return v; } };
typedef std::function<int(int)> IntFunction;
int echo(IntFunction func, int v)
{
return func(v);
}
int main()
{
int v = 5;
X x;
Y y;
int a = echo(std::bind(&X::echoX, x, std::placeholders::_1), v);
int b = echo(std::bind(&Y::echoY, y, std::placeholders::_1), v);
}
Run Code Online (Sandbox Code Playgroud)