
**semantics**: template< typename left_type, typename right_type> struct either { // postcondition, is_left() either( left_type ); // postcondition, is_right() either( right_type ); bool is_left() const; bool is_right() const; // postcondition, is_left() either & operator=( left_type ); // postcondition, is_right() either & operator=( right_type ); // precondition, is_left() left_type left(); // precondition, is_right() right_type right(); private: }; **uses**: **Use 1**: Can be used as an alternative to exceptions or the (error codes+set reference idiom): either<error_code, file_id> load_file(...); vs. error_code load_file( file_id &, ... ); or // throws std::exception file_id load_file(...); **Use 2**: A lightweight alternative to boost::variant when only 2 components are required (either relates to variant in a similar way that pair relates to tuple ). variant<A,B> eitherAOrB; if( A * aPtr = boost::get<A>( &eitherAOrB ) ) std::cout << "A: " << *aPtr; else std::cout << "B: " << boost::get<B>( eitherAOrB ); vs. either<A,B> eitherAOrB; if( eitherAOrB.is_left() ) std::cout << "A: " << eitherAOrB.left(); else std::cout << "B: " << eitherAOrB.right(); --David Sankel