#include namespace mpl = boost::mpl; namespace proto = boost::proto; typedef proto::terminal int_terminal; typedef proto::terminal double_terminal; template struct actor1; struct domain1; struct grammar1 : proto::or_< proto::plus , int_terminal , proto::if_, domain1>()> > {}; struct domain1 : proto::domain< proto::pod_generator , grammar1 , proto::default_domain > {}; template struct actor1 { BOOST_PROTO_BASIC_EXTENDS(Expr, actor1, domain1) }; template struct actor2; struct grammar2 : proto::or_< proto::plus , double_terminal > {}; struct domain2 : proto::domain< proto::pod_generator , grammar2 , domain1 > {}; template struct actor2 { BOOST_PROTO_BASIC_EXTENDS(Expr, actor2, domain2) }; actor1 t1 = {{0}}; actor2 t2 = {{0}}; int main() { t1; t1 + t1; t2; t2 + t2; t1 + t2; }