Header file range/v3/detail/optional.hpp

#include <meta/meta.hpp>

#include <range/v3/range_fwd.hpp>

#include <range/v3/utility/static_const.hpp>

#include <range/v3/detail/variant.hpp>

namespace ranges
{
    inline namespace v3
    {
        struct in_place_t;
        
        inline namespace 
        {
            constexpr auto& in_place = static_const<in_place_t>::value;
        }
        
        template <typename T>
        struct optional
        {
            optional() = default;
            
            optional(T t);
            
            template <typename ... Args, int _concept_requires_40 = 42, typename std::enable_if<(_concept_requires_40==43)||(Constructible<T, Args&&>()), int>::type ... = 0>
            explicit optional(in_place_t, Args&&... args);
            
            explicit operator bool() const;
            
            T& operator*();
            
            T const& operator*() const;
            
            optional& operator=(T const& t);
            
            optional& operator=(T&& t);
            
            void reset();
        };
    }
}