2017-08-19 11 views
0

私は私のunique_ptrをしimplemetedました:ここではdefault_deleter私のクラスunique_ptrにカスタムディテクタを提供するには?

template<typename T> 
struct default_deleter 
{ 
    default_deleter() { } 

    template<typename _Up> 
    default_deleter(const default_deleter<_Up>&) { } 

    void operator()(T* p) const 
    { 
     delete p; 
    } 
}; 

ある

template<class T, typename D = default_deleter<T> > 
class unique_ptr 
{ 
private: 
    T* _ptr; 
    D deleter; 
public: 
    //Default constructor 
    explicit unique_ptr(void): _ptr(nullptr) { } 

    //Constructor with the provided pointer to manage 
    unique_ptr(T* p) throw() : _ptr(p), deleter(default_deleter<T>()) 
{ } 
    unique_ptr(T* p, D d) throw() : _ptr(p), deleter(d) { } 
~unique_ptr(void) throw() // never throws 
{ 
    delete _ptr; 
    _ptr = nullptr; 
} 

が、私は、カスタムデリータ使用しようとしていますとき:

struct MyCustomDeleter { 
    void operator()(SomeResource* p) { 
     p->releaseResources(); 
     delete p; 
    } 
}; 
int main() { 
unique_ptr<SomeResource, MyCustomDeleter> ptr1(new SomeResource(1)); 

を私は 一致を取得していません'MyCustomDeleter :: MyCustomDeleter(default_deleter)'を呼び出すための関数

+3

独自の 'unique_ptr'クラスを実装する理由は何ですか? ['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)で解決しない問題は何ですか? –

+0

まず、問題を再現する[*、* complete *、example](https://stackoverflow.com/help/mcve)に* real *コードを投稿してください。 – WhozCraig

+0

これは実際のコードであり、後でアップグレードされます。 – Dsdsd

答えて

0

unique_ptrをデフォルトのdeleterで常に初期化しますが、コードに矛盾があります。

template<class T, typename D = default_deleter<T> > 
class unique_ptr 
{ 
private: 
    T* _ptr; 
    D deleter; // you do not need this, since the type is known at c-t 
public: 
    //Default constructor 
    explicit unique_ptr(void): _ptr(nullptr) { } // but no initialization of D 

    //Constructor with the provided pointer to manage 
    unique_ptr(T* p) throw() : _ptr(p), deleter(default_deleter<T>()) // wrong D !! 
{ } 
    unique_ptr(T* p, D d) throw() : _ptr(p), deleter(d) { } // weird 

}; 

あなたはコンパイル時にこのDeleterを知っています。

template<class T, typename D = default_deleter<T> > 
class unique_ptr 
{ 
private: 
    T* ptr_{nullptr}; 
public: 
    explicit unique_ptr(T* ptr) noexcept : ptr_(ptr) {} 

    unique_ptr() noexcept = default; 
    unique_ptr(const unique_ptr&) = delete; 
    unique_ptr(unique_ptr&& x) noexcept : ptr_(x.release()) {} 
    ~unique_ptr() noexcept(noexcept(D(T*{}))) { reset(); } 

    void reset() noexcept(noexcept(D(T*{}))) 
     { if (ptr_) { D(ptr_); } ptr_ = nullptr; } 

    T* release() noexcept { auto p = ptr_; ptr_ = nullptr; return p; } 

    unique_ptr& operator= (const unique_ptr&) = delete; 
    unique_ptr& operator= (unique_ptr&& x) noexcept(noexcept(D(T*{}))) 
     { reset(); ptr_ = x.release(); return *this; }; 

    // ... operators op*, ->, etc... 
}; 

実行時にデリータを指定する場合は、テンプレートパラメータであってはなりません。

+0

あなたの答えをありがとう、私は問題を理解し、修正しました。 – Dsdsd

関連する問題