Boost logo

Boost :

From: David B. Held (dheld_at_[hidden])
Date: 2002-09-02 19:31:27

I just wrote this little utility function, and wondered if it is generally

    // Requirements:
    // Ptr must define element_type
    // Ptr::element_type must be default-constructible
    template <class Ptr>
    typename Ptr::element_type const& safe_dereference(Ptr p)
        return p ? *p : typename Ptr::element_type();

    // Requirements:
    // T must be default-constructible
    template <typename T>
    T const& safe_dereference(T* p)
        return p ? *p : T();

In my use case, I am storing shared_ptrs which may or may not actually
point to something. I want to be able to dereference it regardless, and
just get a default value when the pointer is null (which should be obvious
enough from the code). Here's a sample usage:

class some_data
    other_data const& optional_member(void) const
    { return safe_dereference(optional_member_); }
    boost::shared_ptr<other_data> optional_member_;

some_data::optional_member() will always succeed, but will just return
a default value for a null pointer, which is memory-cheaper than
constructing a default value, and pointing to it (unless, I suppose, there
were a "central" default value that everyone pointed to, but that seems
a bit odd).


Boost list run by bdawes at, gregod at, cpdaniel at, john at