From: Korcan Hussein (korcan_h_at_[hidden])
Date: 2006-03-17 08:33:16


Enumerated Types (& simulated pattern matching):

#include <iostream>
#include <boost/mpl/size_t.hpp>
#include <boost/variant.hpp>

namespace mpl = boost::mpl;

struct APPLES_ : mpl::size_t<0u> {} const APPLES;
struct ORANGES_ : mpl::size_t<1u> {} const ORANGES;
struct PEACHES_ : mpl::size_t<2u> {} const PEACHES;

typedef boost::variant<APPLES_, ORANGES_, PEACHES_> fruit_type;

struct fruit_printer : boost::static_visitor<void> {

    void operator()(APPLES_ a) const {
         std::cout << "apples: " << a << '\n';
   }

   template < typename Tp >
   void operator()(Tp v) const { // catch all
        std::cout << typeid(Tp).name() << ": " << v << '\n';
   }
} const print_fruit;

int main() {
   fruit_type my_fruit = APPLES;
   boost::apply_visitor(print_fruit, my_fruit);

   my_fruit = ORANGES;
   boost::apply_visitor(print_fruit, my_fruit);

   my_fruit = PEACHES;
   boost::apply_visitor(print_fruit, my_fruit);

 // my_fruit = mpl::size_t<4u>(); // compile-time error
 // my_fruit = 6u; // compile-time error
}

There might be some merit here such that generalization is applicable with
some macro metaprogramming.