通用成员函数指针

时间:2017-12-21 11:27:05

标签: c++ function-pointers

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

class X{
  int val;
public:
 int echoX(int v)  {
 val = v;
 return v; }
   int getValue() const { return val; }
};

class Y{

   int val;
   public:
   int echoY(int v)  {
   val = v;
   return v;
   }
   int getValue() const { return val; }
};

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

typedef int (__closure *IntFunPtr)(int);

现在,编写一个能够调用X::echoXY::echoY

的函数是微不足道的
void CallObjectMethod(IntFunPtr fPtr, int val){

    fPtr(val);//this can call any member method that accepts an int and returns an int
}


X x, x1;
CallObjectMethod(&x.echoX,4);
CallObjectMethod(&x1.echoX,20);

Y y, y1;
CallObjectMethod(&y.echoY,10);
CallObjectMethod(&y1.echoY,15);

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

谢谢

2 个答案:

答案 0 :(得分:2)

“例如,X和Y具有相同签名的echoX和echoY方法”

Afaik他们没有相同的签名,他们对类实例有一个隐含的第一个参数。通常你会选择std::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);
}

答案 1 :(得分:2)

您可以创建一个通用的模板化函数,它接受您感兴趣的签名,传入对象的实例和指向成员函数的指针。例如:

template<typename T>
void CallObjectMethod(int(T::*func)(int), T& obj, int val)
{
    cout << (obj.*func)(val);
}

现在就像你在例子中提到的那样调用它:

X x, x1;
CallObjectMethod(&X::echoX, x, 10);
CallObjectMethod(&X::echoX, x1, 20);

对于对象Y,您可以执行以下操作:

Y y, y1;
CallObjectMethod(&Y::echoY, y, 10);
CallObjectMethod(&Y::echoY, y1, 20);