Boost logo

Boost :

From: Maksym Motornyy (mmotorny_at_[hidden])
Date: 2005-06-17 10:47:15


Hello, all.

I want to propose typesafe enums. Sources are available in Boost Sandbox
(typesafe_enums.zip). Were tested under VC 7.1.

Main features are:
- type safety;
- meaningful printable names;
- ability to use in switch-case constructs;
- iteration through enumerators;
- enumerator-specific methods;

Basic usage
===========

class season_policy: public boost::simple_enumeration_policy
{
public:
     BOOST_DEFINE_ENUMERATOR( WINTER )
     BOOST_DEFINE_ENUMERATOR( SPRING )
     BOOST_DEFINE_ENUMERATOR( SUMMER )
     BOOST_DEFINE_ENUMERATOR( AUTUMN )

     typedef boost::mpl::vector< WINTER, SPRING, SUMMER, AUTUMN >
enumerators;
};

typedef boost::enumeration< season_policy > season;

Type safety
-----------

season s = season::WINTER();

if ( s ) // accidentally forgotten comparison, wouldn't compile
     BOOST_ASSERT( false );

if ( s == season::SUMMER() )
     std::cout << "Let's go in for fishing!";

Meaningful printable names
--------------------------

season s = season::WINTER();
BOOST_CHECK_EQUAL( s->get_name(), "WINTER" );

Ability to use in switch-case constructs
----------------------------------------

season s = season::SUMMER();

switch ( s.get_id() )
{
case BOOST_ENUMERATOR_ID( season, SUMMER ):
     break;
default:
     BOOST_ERROR( "Should not fall here." );
     break;
}

Iteration through enumerators
-----------------------------

for ( season::iterator i = season::begin(); i != season::end(); ++i )
     std::cout << ( *i )->get_name() << " ";

Advanced usage
==============

class operation_policy
{
public:
     class base_enumerator
     {
     public:
         virtual double eval(
             double operand1, double operand2 ) const = 0;
     };

     template < typename Functor >
     class enumerator_impl: public base_enumerator
     {
     public:
         double eval( double operand1, double operand2 ) const
         {
             return Functor()( operand1, operand2 );
         }
     };

     class PLUS: public enumerator_impl< std::plus< double > >
     {
     };

     class MINUS: public enumerator_impl< std::minus< double > >
     {
     };

     class TIMES: public enumerator_impl< std::multiplies< double > >
     {
     };

     class DIVIDE: public enumerator_impl< std::divides< double > >
     {
     };

     typedef boost::mpl::vector<
         PLUS, MINUS, TIMES, DIVIDE > enumerators;
};

typedef boost::enumeration< operation_policy > operation;

Enumerator-specific methods
---------------------------

for ( season::iterator i = season::begin(); i != season::end(); ++i )
     std::cout << ( *i )->eval( 4, 2 ) << " ";
// expected output is: 6 2 8 2

Is anybody found it useful?

Sincerely,
Maksym Motornyy.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk