首页 > 解决方案 > 将成员函数分配给实例成员的属性

问题描述

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

经过一番挖掘,我理解了方法!=函数,因为实例方法隐含地期望自己的实例(我可以描述它的最佳方式!)这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;
    }
};

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

标签: c++functionc++11callbackinstance

解决方案


您可以使用lambda(带有 capture this)。

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

居住

或者,如果您想坚持std::bind

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

居住

并查看Bind Vs Lambda?什么时候应该使用 std::bind?


推荐阅读