Ответ 1
Ну, ни std::reference_wrapper
, ни std::shared_ptr
не обеспечивают const-распространение, поэтому они не более "const-strict", чем обычный указатель.
Я бы рекомендовал создать свой собственный класс распространения сотовой связи (я не уверен - возможно, что-то подобное уже предусмотрено boost - пожалуйста, дайте мне знать в комментариях)
Мое предложение - это класс:
#include <memory> // for pointer_traits
template <typename Pointer>
class ConstPropagatePointer
{
public:
using element_type = typename std::pointer_traits<Pointer>::element_type;
using pointer = typename std::pointer_traits<Pointer>::pointer;
using const_pointer = element_type const * const;
using reference = element_type&;
using const_reference = element_type const&;
ConstPropagatePointer(Pointer ptr) : ptr(ptr) {}
pointer operator -> ()
{
return &(*ptr);
}
const_pointer operator -> () const
{
return &(*ptr);
}
reference operator * ()
{
return *ptr;
}
const_reference operator * () const
{
return *ptr;
}
private:
Pointer ptr;
};
Итак, это сработает для вас:
class Foo
{
public:
private:
ConstPropagatedPointer<char*> str;
ConstPropagatedPointer<ComplexObj*> obj;
ConstPropagatedPointer<std::shared_ptr<ComplexObj>> obj2;
};