2
ここでキャストされたdeleter関数はobjectで呼び出されますが、これは実際には非constです。
しかし、UBを回避しながら、そのような転送を行うためのクリーンな方法はありますか?転送所有権
ここでキャストされたdeleter関数はobjectで呼び出されますが、これは実際には非constです。
しかし、UBを回避しながら、そのような転送を行うためのクリーンな方法はありますか?転送所有権
デリータタイプとして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タイプにも一般化できます。
は、オブジェクトの割り当てと構築のための非常に洗練された(ひどい)カスケードの中で最も恐ろしい部分を書き換えました。 今のところ私はもっとクリーンなアプローチを考えることができません、ありがとう。 –
コードをより明確にフォーマットできますか? const_castという名前の – WhiZTiM