$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] [proto] learning proto slowly, a small (math)complex library
From: alfC (alfredo.correa_at_[hidden])
Date: 2011-01-10 16:42:53
> 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;
}