【问题标题】:How to use pointer to member function when when pointer to global function is required?当需要指向全局函数的指针时如何使用指向成员函数的指针?
【发布时间】:2014-09-24 12:03:44
【问题描述】:

我有以下问题。我必须使用一个接受回调的函数。实现回调是棘手的部分,因为除了可以从输入参数中提取之外,我还需要更多信息。我试着举个例子:

typedef int (*fptr) (char* in, char* out); // the callback i have to implement
int takeFptr(fptr f, char* someOtherParameters); // the method i have to use

问题是我需要除“in”参数之外的其他信息来构造“out”参数。我试过这种方法:

class Wrapper {
    public:
        int callback(char* in, char* out){
           // use the "additionalInfo" to construct "out"
        }
        char* additionalInfo;
}

...
Wrapper* obj = new Wrapper();
obj->additionalInfo = "whatIneed";
takeFptr(obj->callback, someMoreParams);

我从编译器收到以下错误:

错误:无法将 'Wrapper::callback' 从类型 'int (Wrapper::)(char*, char*)' 转换为类型 'fptr {aka int(*)(char*, char*)}'

【问题讨论】:

  • 呃。如果没有希望更改您需要用来获取std::function 或其他内容的界面,那么bind 或类似内容将无法帮助您。您只需要创建一个包装器全局函数,该函数知道在哪里可以找到Wrapper 的某个实例并在其上调用callback。这很糟糕,因为它有效地迫使您拥有某种全球数据。
  • 即使您可以从指向成员的指针转换为普通函数指针(您不能在可移植代码* 中),您如何期望 this 指针可用于回调?

标签: c++ pointers function-pointers


【解决方案1】:

你需要传递你需要传递的东西,在这种情况下是一个指向函数的指针。

::std::function<int (char*, char*)> forwardcall;

int mycallback(char* in, char* out) // extern "C"
{
  return forwardcall(in, out);
}

forwardcall 可以包含任何函子,例如:

forwardcall = [obj](char* in, char* out){ return obj->callback(in, out); };

【讨论】:

  • 为什么是extern "C"?从错误中没有任何迹象表明它是需要的。
  • @BoBTFish 以防万一。
  • 如果fptr 回调类型未声明extern "C",那么当您尝试将其传递给takeFPtr 时,“以防万一”将其添加到您的回调中应该是一个错误(尽管大多数编译器不执行该规则)
  • @JonathanWakely 我不知道你可以将extern "C" 放入typedef。有可能吗?
  • [dcl.link]/1 "具有不同语言链接的两个函数类型是不同的类型,即使它们在其他方面相同。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多