通用成员函数指针

dsp*_*ser 3 c++ function-pointers

我想知道标准 C++ 中是否有一种方法(似乎不支持这种方法,但也许我没有仔细看)来声明指向具有相同签名的任何类成员函数的指针。例如,X 和 Y 具有具有相同签名的 echoX 和 echoY 方法

\n\n
class 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};\n
Run Code Online (Sandbox Code Playgroud)\n\n

一些 C++ 实现通过扩展允许此功能(例如,VCL 使用关键字__closure)。

\n\n
typedef int (__closure *IntFunPtr)(int);\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,编写一个能够调用 或 的函数很X::echoX简单Y::echoY

\n\n
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);\n
Run Code Online (Sandbox Code Playgroud)\n\n

此功能对于实现事件处理程序等非常有用。

\n\n

谢谢

\n

lar*_*ars 5

“例如,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)