继承类中的shared_from_this()中的类型错误(是否存在dyn.type-aware共享指针?)

时间:2017-12-18 13:21:37

标签: c++ shared-ptr smart-pointers dynamic-cast static-cast

我有一个基本的View Controller类,它使用' enable_shared_from_this'

class ViewController :
public std::enable_shared_from_this<ViewController>
{ // ...
};

和一个孩子:

class GalleryViewController : public ViewController {
     void updateGallery(float delta);
}

当我尝试将当前实例传递给第三方时,问题就出现了(比如在某处调度lambda函数) 有一个(罕见的)条件,实例(GalleryViewController)将解除分配,因此我无法捕获这个&#39;直接,我需要使用shared_from_this():

捕获共享组
void GalleryViewController::startUpdate()
{
    auto updateFunction = [self = shared_from_this()](float delta)
    {
        return self->updateGallery(delta); // ERROR: ViewController don't have updateGallery() method!
    };
    scheduler->schedule(updateFunction); // takes lambda by value
}

问题是shared_from_this()会返回一个没有updateGallery()方法的shared_ptr<ViewController>

我真的很讨厌做维护噩梦的dynamic_cast(或者甚至是静态)。代码很难看!

updateFunction = [self = shared_from_this()](float delta)
    {
            auto self2 = self.get();
            auto self3 = (UIGalleryViewController*)self2;
            return self3->updateGallery(delta);
    };

是否有任何默认模式可以解决此问题?动态类型感知共享指针?我应该使用enable_shared_from_this<GalleryViewController>双重继承子类吗?

1 个答案:

答案 0 :(得分:2)

void GalleryViewController::startUpdate(bool shouldStart)
{
    if (shouldStart == false) {
    updateFunction = [self = shared_from_this()](float delta)
    {
        return self->updateGallery(delta); // ERROR: ViewController don't have updateGallery() method!
    };
    scheduler->schedule(updateFunction); // takes lambda by value
}
     

问题是shared_from_this()返回一个   shared_ptr<ViewController>没有updateGallery()的{​​{1}}   方法

     

我真的很讨厌做动态广播(或者甚至是静态)   维护噩梦。代码很难看!

这就是std::static_pointer_caststd::dynamic_pointer_cast的用途。在投射之前,您不必使用.get()来获取原始指针。

void GalleryViewController::startUpdate(bool shouldStart)
{
    if (shouldStart == false) {
    updateFunction = [self = std::static_pointer_cast<GalleryViewController>(shared_from_this())](float delta)
    {
        return self->updateGallery(delta);
    };
    scheduler->schedule(updateFunction); // takes lambda by value
}