
See the boostcon slides of Eric last year. All you need is to give your complex expression an operator to cast itself to std::complex in which you evaluate the expression real and imag part and retrun the newly constructed std::complex out of it.
great, nice resource. I translated the map_list_of example into the complex example. There is still work to do, the code doesn't work yet. I guess I have to still tell proto that "complex_cartesian_expr" (didn't know what other name to put) is of type proto::plus< proto::terminal<double> , proto::multiplies<proto::terminal<double>, proto::terminal<i_tag> >
. I don't know how to do that. complete code at the end of the email.
Incidentally, i am using this very same example in a courses on DSEL design in C++ i am starting to write atm.
I knew it could be a natural example since most people know simple complex arithmetic and std::complex<double>.
So i can shed some light if you want.
That would be great. Any help is greatly appreciated and I promise my feedback. ---- #include <boost/proto/core.hpp> #include <complex> namespace pretty{ namespace proto = boost::proto; struct i_tag{}; proto::terminal< i_tag >::type const i = {{}}; template< typename Expr > struct complex_cartesian_expr; struct complex_cartesian_domain : proto::domain< proto::generator< complex_cartesian_expr > > {}; template<typename Expr> struct complex_cartesian_expr : proto::extends< Expr, complex_cartesian_expr< Expr >, complex_cartesian_domain >{ complex_cartesian_expr( Expr const & expr = Expr() ) : proto::extends< Expr, complex_cartesian_expr< Expr >, complex_cartesian_domain >( expr ){} template<class K, class V, class C, class A> operator std::complex<K>() const{ std::complex<K> m(proto::value( proto::child_c<1>(*this) ), proto::value( proto::child_c<1>(proto::child_c<2>(*this)) ) ); return m; } }; } int main(){ using namespace pretty; std::complex<double> z(4. + 5.*i); return 0; }