私はデリータの関数ポインタを取得しましたが、ほとんどの場合、何かの内部コピーを維持する場合にのみ、デリータは必要ありません。現在、私はヌープ削除関数でそれを行います:
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_)
です。
さて、コーディングの途中で「うーん、どちらのバージョンの方が速いかな?」と思いついたので、最適化というよりは個人的な興味です。質問がちょっとばかげているように聞こえる場合は申し訳ありませんが、それは私を悩ませているので、本当に知りたいです. 事前にご回答いただきありがとうございます。