const propaging:
template<typename T>
struct const_ptr : std::unique_ptr<T> {
using std::unique_ptr<T>::unique_ptr;
const T& operator*() const {
return std::unique_ptr<T>::operator*();
}
const T* operator->() const {
return std::unique_ptr<T>::operator->();
}
T& operator*() {
return std::unique_ptr<T>::operator*();
}
T* operator->() {
return std::unique_ptr<T>::operator->();
}
};
const const_ptr :
const_ptr<int> iptr = std::make_unique<int>(6);
*iptr = 7;
const auto ciptr = std::move(iptr);
*ciptr = 2;
However, keep in mind that since we publicly distribute std::unique_ptr, its function is still available. You can use private inheritance and use all other functions except our custom one:
template<typename T>
struct const_ptr : private std::unique_ptr<T> {
using std::unique_ptr<T>::unique_ptr;
using std::unique_ptr<T>::release;
using std::unique_ptr<T>::reset;
};
source
share