|
Boost : |
From: Larry Evans (cppljevans_at_[hidden])
Date: 2005-10-23 20:13:37
On 10/23/2005 12:12 PM, Korcan Hussein wrote:
[snip]
> I'll get back to you on that one, for the time being i have uploaded the
> example i have been writing about, it is in the vault here:
> http://www.boost-consulting.com/vault/index.php?action=downloadfile&filename=expr_test.cpp&directory=Template%20Metaprogramming&
>
> In the example program you should see something similar, take note however
I ran it and tried to understand it. AFAICT, the key part of the code
is:
template < typename Tp >
struct var {
...
struct basic_eval : boost::static_visitor<float> {
size_type curr_indx;
basic_eval(size_type i = 0): curr_indx(i) {}
float operator()(const Tp& val) const {
return val[curr_indx];
}
template < typename Expression >
float operator()(const Expression& exp) const {
using boost::apply_visitor;
typedef typename Expression::operation_type Oper;
float lhs_val=apply_visitor(*this, exp.get_lhs());
float rhs_val=apply_visitor(*this, exp.get_rhs());
float my_val=Oper::apply(lhs_val,rhs_val);
return my_val;
}
};
...
};
I could see the Expression::operation_type is one of:
addf_tag
minusf_tag
The apply_visitor is from:
boost/variant/detail/apply_visitor_unary.hpp
and the body of this apply_visitor is:
apply_visitor(const Visitor& visitor, Visitable& visitable)
{
return visitable.apply_visitor(visitor);
}
Since there's no apply_visitor in the Expression<...> ,
I added a few variables (*_val) to store intermediate results to
enable using gdb to see what was going on.
After tracing several levels of calls in gdb in an effort to
find how:
apply_visitor(*this, exp.get_lhs())
get's back to var<Tp>::basic_eval::operator(...), I finally just decided
it does, somehow, and since all variants of the var<Tp>::expr have
a corresponding exact match amoung the basic_eval::operator(...)'s,
not dynamic dispatching is done.
HTH any other reviewers of expr_test.cpp.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk