Boost logo

Boost Users :

Subject: Re: [Boost-users] [phoenix][units] make boost.phoenix play well with boost.units
From: alfC (alfredo.correa_at_[hidden])
Date: 2010-06-04 18:01:32


On Jun 3, 7:52 pm, Joel de Guzman <j..._at_[hidden]> wrote:
> On 6/4/10 10:31 AM, alfC wrote:
> There is hope. Just specialize boost::phoenix::result_of_xxx
> (e.g. boost::phoenix::result_of_plus<X, Y>).

I specilized result_of_multiplies and still no luck:

#include<boost/spirit/home/phoenix.hpp>
#include<iostream>
#include<typeinfo>
#include<boost/units/systems/si.hpp>

namespace boost{
namespace phoenix{
using namespace boost::units;
template<> //in general template<class XUnit, class YUnit>
struct result_of_multiplies<quantity<si::length>, quantity<si::length>
>{
        typedef quantity<si::area> type;
};
}}

using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;
using namespace boost::units;

template<class LambdaExp>
void expression_analizer(actor<LambdaExp> l){
        std::clog
                <<"type of argument expression: "
                <<typeid(LambdaExp).name()<<std::endl;
        std::clog<<"type of return on double: "
                <<typeid(
                        typename LambdaExp::template result<
                                basic_environment<double>
>::type
                ).name()<<std::endl;
        std::clog
                <<"type of return on quantity<length>: "
                <<typeid(
                        typename LambdaExp::template result<
                                basic_environment<
                                        quantity<si::length>
> >::type
                ).name()<<std::endl;
        std::clog<<"... should be "<<
        typeid( quantity<si::length>()*quantity<si::length>() ).name()
        <<std::endl;
}

int main(){
        expression_analizer(arg1*arg1);
        return 0;
}


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net