
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.