在shared_ptr<>内调用包装器其成员函数的实例

时间:2015-03-12 21:25:04

标签: c++ shared-ptr std-function stdbind

我正在尝试使用内部成员函数的std :: bind()创建一个转发调用包装器,该实例已创建为shared_ptr<>。看起来没有机会。

简而言之:

std::shared_ptr<Parent> _instance(std::make_shared<Child>());
_instance->init();
_instance->proc();

class Parent : std::enable_shared_from_this<Parent>
{
protected:
    std::vector<std::function<void()>> _vector;

public:
    virtual void init() = 0;

    virtual void proc() final
    {
        for (auto& f : _vector) {
            f();
        }
    }
};

class Child : public Parent
{
protected:
    std::string _s1;
    int _i1;

public:
    virtual void init() override
    {
        // XXX Won't compile
        _vector.push_back(std::bind(&Child::bingo, shared_from_this()));

        // BUG Looks bad in case when current "this" has been wrapped by shared_ptr<Parent>
        _vector.push_back(std::bind(&Child::bingo, this));

        // NOTE Lambda doesn't work here as well, because I need an access(in the ::bingo()) to the data members
    }

    void bingo()
    {
        std::cout << "Bingo!" << _s1 << _i1 << std::endl;
    }
};

这不是一个现实生活中的例子,如果有人愿意提供重新设计作为解决方案;)

1 个答案:

答案 0 :(得分:2)

绑定到原始指针(this)并不是特别糟糕。该函数存储在此对象中的向量中,因此只要可以从该向量访问该指针,指针就会保持有效。如果将函数复制出向量,则会遇到问题,然后在销毁对象后尝试调用它。

如果你想要一个共享指针,你需要将指针转换为Parentshared_from_this()给你)指向Child(你想要的成员)的指针致电):

static_pointer_cast<Child>(shared_from_this());

只要它抓取bindthis,lambda就会像shared_from_this()一样有用。