【问题标题】:C++ function pointer to member function inside class指向类内部成员函数的C++函数指针
【发布时间】:2019-11-16 22:49:04
【问题描述】:

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

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

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

当我尝试构建它时,编译器会抛出一个错误:

Error C3867: 'MyWindow::memberFunction': non-standard syntax; use '&' to create a pointer to member

【问题讨论】:

    标签: c++ function pointers compiler-errors


    【解决方案1】:

    C3867的错误信息告诉你第一个问题:你需要使用&amp;来形成一个函数指针。

    您的下一个问题是您没有函数指针,而是指向-成员-函数的指针,这与您的 std::function 不兼容,因为它在任何地方都没有存储或传递包含“this”指针的隐式第一个参数。

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

    您还需要拼写为MyWindow::memberFunction 而不是this-&gt;memberFunction,因为它就是这样(引用 GCC:“ISO C++ 禁止获取不合格或带括号的非静态成员的地址函数形成一个指向成员函数的指针")。

    所以:

    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); };
    

    【讨论】:

    • 哎呀,我跟不上 c++ 语法糖了,但看起来 Perl 爱好者已经接管了 ANSI 指导委员会!
    • 我建议使用&amp;MyWindow::memberFunction 而不是&amp;this-&gt;memberFunction 来强调成员函数体是所有对象的一个​​,并且具有相同的地址。此外,我不确定&amp;this-&gt;memberFunction 是否有效
    • 使用默认的复制捕获只捕获this 似乎有点奇怪。据我了解,根据cppreference,该行为将在c++20 中被弃用。
    • @super True - 习惯。也许[this] 会更好。 FWIW 我从不觉得奇怪 - this 确实(或应该)被副本捕获(尽管 *this 不会)
    猜你喜欢
    • 2011-12-09
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多