#include <iostream>
#include "boost/variant.hpp"

struct A {};
struct B {};

typedef boost::variant<A, B> AorB;

void foo(A&) { std::cout << "foo(A&)\n"; }
void foo(B&) { std::cout << "foo(B&)\n"; }

int main()
{
  A a;
  AorB c;
  c = a;
  foo(boost::get<A>(c));
  try
  {
    foo(boost::get<B>(c));
  }
  catch(boost::bad_get& e)
  {
    std::cout << e.what();
  }
}