C++ C++;指向类内成员函数的函数指针

C++ C++;指向类内成员函数的函数指针,c++,function,pointers,compiler-errors,C++,Function,Pointers,Compiler Errors,我想在类中存储一个指向对象的私有成员函数的函数指针。 基本上我想这样做: MyWindow::MyWindow() { std::function<void(int&)> func = this->memberFunction; // ERROR } void MyWindow::memberFunction(int& i) { // do something } C3867的错误消息告诉您第一个问题:您需要使用&来形成函数指针 下一个问题是您没有函

我想在类中存储一个指向对象的私有成员函数的函数指针。 基本上我想这样做:

MyWindow::MyWindow()
{
  std::function<void(int&)> func = this->memberFunction; // ERROR
}

void MyWindow::memberFunction(int& i)
{
  // do something
}

C3867的错误消息告诉您第一个问题:您需要使用
&
来形成函数指针

下一个问题是您没有函数指针,而是有一个指向成员函数的指针,它与
std::function
不兼容,该函数缺少用于存储或传递包含“this”指针的隐式第一个参数的任何位置

但是,您可以“绑定”该参数的值,实际上是将其硬编码到函子中

您也需要拼写它:代码> MyVelu::成员函数< /C> >而不是<代码> > ->成员函数< /C> >,因为这只是它的方式(引用GCC:“ISO C++禁止使用不合格或括号的非静态成员函数的地址来形成指向成员函数的指针”)。 因此:


C3867的错误消息告诉您第一个问题:您需要使用
&
来形成函数指针

下一个问题是您没有函数指针,而是有一个指向成员函数的指针,它与
std::function
不兼容,该函数缺少用于存储或传递包含“this”指针的隐式第一个参数的任何位置

但是,您可以“绑定”该参数的值,实际上是将其硬编码到函子中

您也需要拼写它:代码> MyVelu::成员函数< /C> >而不是<代码> > ->成员函数< /C> >,因为这只是它的方式(引用GCC:“ISO C++禁止使用不合格或括号的非静态成员函数的地址来形成指向成员函数的指针”)。 因此:


艾克,我不跟上C++句法糖,但看起来Perl信徒已经接管了ANSI指导委员会!我建议使用
&MyWindow::memberFunction
而不是
&this->memberFunction
来强调成员函数体是所有对象的函数体,并且具有相同的地址。此外,我不确定
&这个->成员函数
在暗示默认的复制捕获时是否有效,以仅捕获
这个
似乎有点奇怪。据我所知,在
c++20
中,这种行为将根据@super-True-havity被弃用。也许
[这个]
会更好。FWWW我从未发现奇怪——<代码>这个< /C>确实是(或应该是)用拷贝捕获的(虽然<代码> *这个<代码>不是),我不跟上C++语法糖,但看起来Perl信徒已经接管了ANSI指导委员会!我建议使用
&MyWindow::memberFunction
而不是
&this->memberFunction
来强调成员函数体是所有对象的函数体,并且具有相同的地址。此外,我不确定
&这个->成员函数
在暗示默认的复制捕获时是否有效,以仅捕获
这个
似乎有点奇怪。据我所知,在
c++20
中,这种行为将根据@super-True-havity被弃用。也许
[这个]
会更好。FWIW我从未觉得奇怪-
这个
确实(或者应该)被拷贝捕获(虽然
*这个
不会)
Error C3867: 'MyWindow::memberFunction': non-standard syntax; use '&' to create a pointer to member
using std::placeholders;
std::function<void(int&)> func = std::bind(&MyWindow::memberFunction, this, _1);
std::function<void(int&)> func = [this](int& x) { memberFunction(x); };
auto func = [this](int& x) { memberFunction(x); };