C++ 继承类中的_this()在共享_中输入了错误的类型(是否存在dyn.type-aware共享指针?)

C++ 继承类中的_this()在共享_中输入了错误的类型(是否存在dyn.type-aware共享指针?),c++,shared-ptr,smart-pointers,dynamic-cast,static-cast,C++,Shared Ptr,Smart Pointers,Dynamic Cast,Static Cast,我有一个基本视图控制器类,它使用enable\u shared\u from\u this 当我试图将当前实例传递给第三方时,问题就出现了(比如说,将lambda函数安排在某个地方) 实例(GalleryViewController)将解除分配是一种(罕见的)情况,因此我无法直接捕获“this”,我需要从this()捕获具有shared\u的共享组: 问题是shared\u from_this()返回的shared\u ptr没有updateGallery()方法 我真的很讨厌做dynamic\

我有一个基本视图控制器类,它使用
enable\u shared\u from\u this

当我试图将当前实例传递给第三方时,问题就出现了(比如说,将lambda函数安排在某个地方)

实例(
GalleryViewController
)将解除分配是一种(罕见的)情况,因此我无法直接捕获“this”,我需要从this()捕获具有
shared\u的共享组:

问题是
shared\u from_this()
返回的
shared\u ptr
没有
updateGallery()
方法

我真的很讨厌做
dynamic\u cast
(在这种情况下甚至是静态的),这是维护的噩梦。代码很难看

updateFunction = [self = shared_from_this()](float delta)
    {
            auto self2 = self.get();
            auto self3 = (UIGalleryViewController*)self2;
            return self3->updateGallery(delta);
    };
是否有任何默认模式可以解决此问题?动态类型感知共享指针?我是否应该使用
从\u this
启用\u shared\u双重继承子类

问题是
shared\u from\u this()
返回一个
shared\u ptr
没有
updateGallery()
方法

我真的很讨厌做动态(甚至在这个例子中是静态的)这是 维护噩梦。代码很难看

updateFunction = [self = shared_from_this()](float delta)
    {
            auto self2 = self.get();
            auto self3 = (UIGalleryViewController*)self2;
            return self3->updateGallery(delta);
    };
这就是我们的目的。在强制转换之前,不必使用
.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
}
void GalleryViewController::startUpdate(bool shouldStart)
{
如果(shouldStart==false){
updateFunction=[self=std::static\u pointer\u cast(shared\u from\u this())](float delta)
{
返回self->updateGallery(增量);
};
scheduler->schedule(updateFunction);//按值获取lambda
}

*这个
已经由一个
共享的\u ptr
管理了吗?如果不是,那么就没有办法解决释放问题。你通常无法同时获得两个世界的最佳性能w.r.t.多态性;传递基类指针的能力,以及在“实际”上轻松调用函数的能力类型。动态强制转换是必需的。在基类中创建虚拟函数可能更容易。@AndyG当然可以,但是派生类可以以某种方式“重写”父类从该模板类的方法继承的enable_shared_,对吗?换句话说,如果派生类上的shared_from_this()返回shared_ptr专门化,那就太好了(因为我在实际派生实例中调用此方法,而不是通过基指针)我不建议使用静态\u指针\u转换,除非OP能保证转换总是正确的。动态\u指针\u转换更安全。@AndyG,正确。但是,我可以推断,如果在调用
GalleryViewController::startUpdate之前没有调用UB(布尔应该开始)
,那么
静态指针\u cast
就可以了。因为在当前成员函数中,
这个
属于
GalleryViewController*
类型。或者我在这里遗漏了什么吗?@WhiZTiM没错,函数
startUpdate
非常特定于子类,所以它总是
GalleryViewController*
。我唯一关心的是为什么不可能
以某种方式重写继承模板
的shared\u from\u this()方法
启用\u shared\u from\u this
以匹配实际派生类。我正在从实际子类调用shared\u from\u this()(不是通过基指针)因此,类型在编译时是已知的。是否有任何方法可以从\u this
重新继承
enable\u shared\u并重写该方法?或者我说的是愚蠢的事情?@barney,不幸的是,
shared\u from\u this()
不是一个虚拟函数,不能被重写。@WhiZTiM除了构造函数和析构函数外,所有函数都可以被重写。您不能确保的是,如果函数不是虚拟函数,将调用哪个版本(当函数是虚拟函数时,调用最派生的类版本;如果您不在构造函数或析构函数中)但是,在这种情况下,它不是必需的。因此barney可以在他的
GalleryViewController
类中创建自己的
shared\u from\u this()
return std::static\u pointer\u cast(shared\u from\u this());
。这样,如果他需要多次使用智能指针,他就有一个隐藏的cast。
updateFunction = [self = shared_from_this()](float delta)
    {
            auto self2 = self.get();
            auto self3 = (UIGalleryViewController*)self2;
            return self3->updateGallery(delta);
    };
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
}
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
}