在 shared_ptr<> 实例的成员函数中调用包装器
Call wrapper inside shared_ptr<> instance on its member function
我正在尝试使用已创建为 shared_ptr<> 的实例内部成员函数的 std::bind() 进行转发调用包装。看来没有机会了。
简而言之:
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;
}
};
这不是现实生活中的例子,以防万一有人想提供重新设计的解决方案 ;)
绑定到原始指针 (this
) 在这里并不是特别糟糕。该函数存储在该对象内的向量中,因此只要可从该向量访问该指针,它就会保持有效。如果您将函数从向量中复制出来,然后在销毁对象后尝试调用它,您只会遇到问题。
如果您确实需要共享指针,则需要将指向 Parent
(shared_from_this()
给您)的指针转换为指向 Child
(其成员你想打电话):
static_pointer_cast<Child>(shared_from_this());
只要捕获 this
或 shared_from_this()
.
,lambda 就可以像 bind
一样工作
我正在尝试使用已创建为 shared_ptr<> 的实例内部成员函数的 std::bind() 进行转发调用包装。看来没有机会了。
简而言之:
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;
}
};
这不是现实生活中的例子,以防万一有人想提供重新设计的解决方案 ;)
绑定到原始指针 (this
) 在这里并不是特别糟糕。该函数存储在该对象内的向量中,因此只要可从该向量访问该指针,它就会保持有效。如果您将函数从向量中复制出来,然后在销毁对象后尝试调用它,您只会遇到问题。
如果您确实需要共享指针,则需要将指向 Parent
(shared_from_this()
给您)的指针转换为指向 Child
(其成员你想打电话):
static_pointer_cast<Child>(shared_from_this());
只要捕获 this
或 shared_from_this()
.
bind
一样工作