我得到了一个用于删除的函数指针,但大多数情况下,这个删除器是不需要的,只有在我维护某些东西的内部副本时才需要。目前,我使用一个无操作的删除器函数来实现:
class MyClass{
public:
// bind object
template<class Type>
void Bind(Type* obj){
Cleanup();
object_ = obj;
}
// bind object with internal copy
template<class Type>
void Bind(Type obj){
Cleanup();
object_ = new Type(obj);
deleter = &Deleter<Type>;
}
private:
template<class Type>
static void Deleter(void* obj_ptr){
Type* obj = static_cast<Type*>(obj_ptr);
delete obj;
}
static void NoopDeleter(void* unused){
}
void Cleanup(){
(*deleter_)(object_);
object_ = 0;
deleter_ = &NoopDeleter;
}
typedef void (*DeleterFunc)(void*);
void* object_;
DeleterFunc deleter_;
};
现在另一个明显的选择是在不需要时将其设置为
0
,并在Cleanup
函数中使用if(deleter_ != 0) (*deleter_)(object_)
进行检查。现在在编码过程中,我突然想到:"嗯,哪个版本会更快?",所以这更多地是出于个人兴趣而不是优化。如果问题听起来有点蠢,请谅解,但它让我困扰,我真的想知道。先谢谢你们的回答!