OK.

Last question. I changed my make_expr to use domain_of and it worked nice for the base case.
Then I changed the domain of the exponent thingy.

exponent takes a float/double vec adn return an integral vec of the same size. So I gave to simd_expr<tag::exponent_> the same domain as vec<integer>. Now I can build things like :

exponent(vf) + vi with the proper type and everything works.

Now, I had some strange behavior in my calalble_context. When I debug it, it seems that the type of exponent(vf) is

simd_expr< vec<float,4>, domain< simd_info<int,4> > >

instead of some :

simd_expr< bp::terminal<vec<float,4> >, domain< simd_info<int,4> > >

So I don't how how to catch it in my context operator() overload.

For info, my exponent function is something like :

template<class A0> static inline typename
proto::result_of::make_expr< tag::exponent_
, domain< make_integrer_vec<A0>::info_type >
, A0 const&>
exponent( A0 const a0)
{
return proto::make_expr< tag::exponent_
, domain< make_integrer_vec<A0>::info_type > >( boost::cref(a0));
}