gpt4 book ai didi

c++ - 通用成员函数指针

转载 作者:行者123 更新时间:2023-11-30 01:38:24 25 4
gpt4 key购买 nike

我想知道在标准 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);

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

谢谢

最佳答案

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

关于c++ - 通用成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47923966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com