2017-02-13 17 views
2

ここでキャストされたdeleter関数はobjectで呼び出されますが、これは実際には非constです。
しかし、UBを回避しながら、そのような転送を行うためのクリーンな方法はありますか?転送所有権

+0

コードをより明確にフォーマットできますか? const_castという名前の – 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()}}; 
} 

これはどのDeleterタイプにも一般化できます。

+0

は、オブジェクトの割り当てと構築のための非常に洗練された(ひどい)カスケードの中で最も恐ろしい部分を書き換えました。 今のところ私はもっとクリーンなアプローチを考えることができません、ありがとう。 –

関連する問題