2017-02-13 94 views
2

隨着reinterpret_cast,將是這樣的:轉讓所有權

std::unique_ptr< const T , void (*) (const T *) > 
to_const (std::unique_ptr< T , void (*) (T *) > &ptr) 
{ 
    return { ptr.release() , 
      reinterpret_cast< void (*) (const T *) >(ptr.get_deleter()) } ; 
} 

這裏鑄造的deleter函數將會用object來調用,這實際上是非const的。
但有沒有更清潔的方式來做這種轉移,同時避免UB?

+0

您能否更清楚地格式化您的代碼? – WhiZTiM

回答

2

不與void (*)(const T *)作爲刪除者類型,沒有。但是我們可以製作自己的刪除器:

template <class T> 
struct ConstDeleter { 
    void (*deleter)(T*); 

    void operator()(T const* ptr) { 
     deleter(const_cast<T*>(ptr)); 
    } 
}; 

std::unique_ptr<T const, ConstDeleter<T>> 
to_const(std::unique_ptr<T, void (*)(T*)>& ptr) 
{ 
    return {ptr.release(), ConstDeleter<T>{ptr.get_deleter()}}; 
} 

這可以推廣到任何刪除器類型。

+0

以const_cast的名義我重寫了我的相當複雜(可怕)級聯對象分配和構造中最可怕的部分。 現在我不能想到更清潔的方法,謝謝。 –