[/ Boost.Optional Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] [section Examples] [section Optional return values] optional<char> get_async_input() { if ( !queue.empty() ) return optional<char>(queue.top()); else return optional<char>(); // uninitialized } void receive_async_message() { optional<char> rcv ; // The safe boolean conversion from 'rcv' is used here. while ( (rcv = get_async_input()) && !timeout() ) output(*rcv); } [endsect] [section Optional local variables] optional<string> name ; if ( database.open() ) { name.reset ( database.lookup(employer_name) ) ; } else { if ( can_ask_user ) name.reset ( user.ask(employer_name) ) ; } if ( name ) print(*name); else print("employer's name not found!"); [endsect] [section Optional data members] class figure { public: figure() { // data member 'm_clipping_rect' is uninitialized at this point. } void clip_in_rect ( rect const& rect ) { .... m_clipping_rect.reset ( rect ) ; // initialized here. } void draw ( canvas& cvs ) { if ( m_clipping_rect ) do_clipping(*m_clipping_rect); cvs.drawXXX(..); } // this can return NULL. rect const* get_clipping_rect() { return get_pointer(m_clipping_rect); } private : optional<rect> m_clipping_rect ; }; [endsect] [section Bypassing expensive unnecessary default construction] class ExpensiveCtor { ... } ; class Fred { Fred() : mLargeVector(10000) {} std::vector< optional<ExpensiveCtor> > mLargeVector ; } ; [endsect] [endsect]