|
Boost : |
Subject: [boost] Interest in an 'either' library?
From: David Sankel (camior_at_[hidden])
Date: 2013-06-21 12:35:50
**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
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk