【问题标题】:Assigning member functions to a property of an instance member将成员函数分配给实例成员的属性
【发布时间】:2023-03-27 05:43:01
【问题描述】:

我仍在寻找有关 C++ 的方法,但遇到了问题。我有一个包含另一个类的实例成员(不能继承)的类,其中包括一个回调。我想将此回调注册到父类,但遇到了困难。

经过一番挖掘,我理解了 method != function,因为实例方法隐含地期望自己的实例(我可以描述它的最佳方式!)并且 std::bind 是一个选项,但我无法得到这个当签名不是<void(void)>时工作。

我还阅读了有关实现为接口的文章,类似于委托(我来自 Swift 背景),这也很吸引人。

这是我想要达到的目标的准系统版本:

class ChildClass
{
public:
    std::function<int(int)> callback;
};

class MainClass
{
public:
    ChildClass childClass;

    MainClass()
    {
        this->childClass.callback = this->square;
    }

private:
    int square(int i)
    {
        return i * i;
    }
};

我知道不匹配的类型会导致错误,但我不知道如何让它们一起玩。

【问题讨论】:

  • 对于成员函数,您需要一个成员函数指针。由于该函数不需要在类中,如果它是免费函数,您会更轻松。
  • 这可能会有所帮助。 stackoverflow.com/questions/56212392/…
  • 你说得对,在我最初的实现中它是一个免费函数,但我不得不将它移动到一个成员中,因为我将使用其中的状态(平方只是一个演示)。跨度>

标签: c++ function c++11 callback instance


【解决方案1】:

您可以使用lambda(捕获this)。

MainClass()
{
    this->childClass.callback = [this](int i) { return this->square(i); };
}

LIVE

或者如果你想坚持std::bind:

MainClass()
{
    using namespace std::placeholders;
    this->childClass.callback = std::bind(&MainClass::square, this, _1);
}

LIVE

看看Bind Vs Lambda?When should I use std::bind?

【讨论】:

  • 完美运行!我很接近,只是从未标记任何占位符。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多