我有一个基本的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>
双重继承子类吗?
答案 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_cast
和std::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
}