【发布时间】:2012-08-18 22:02:01
【问题描述】:
我有这个函数可以将任何派生自Object 的类添加到容器中。
template<class T> void registerObject(T& object) {
auto sp = std::shared_ptr<T>(&object, [](T*){});
std::shared_ptr<Object> op = std::static_pointer_cast<Object>(sp);
objects_.push_back(op);
}
static_pointer_cast 中发生了什么使自定义删除方法对新指针仍然有效?
我问是因为 lambda 不会评估为采用派生类型吗?但是然后转换的指针会将Object* 传递给那个lambda?那么调用自定义删除时是否会发生一些“向上转换”?我认为这是不可能的,因为您不能保证基类型是派生类型?
【问题讨论】:
-
等一下。您正在创建一个
shared_ptr的向量,其中每个shared_ptr都有一个空删除器? -
@pmr 如果通过此方法添加对象,则可以。我有另一种方法
void registerObject(std::shared_ptr<Object>)。这是为了阻止它尝试删除不应该删除的内容。 -
@rhalbersma 看起来不像那个问题的重复。
-
@johannes:对不起,我盲目投票。应该先看看。我不确定你的意思是什么,但现在看了之后我也不完全确定重复性,所以。那我就回答ze问题。 hrmpf.