| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
6.4.4 Subexpressions
Our scalar product class has two subexpressions: the left and right
operands. It might be a good idea to make them accessible via the standard
nops() and op() methods:
size_t sprod::nops() const
{
return 2;
}
ex sprod::op(size_t i) const
{
switch (i) {
case 0:
return get_struct().left;
case 1:
return get_struct().right;
default:
throw std::range_error("sprod::op(): no such operand");
}
}
|
Implementing nops() and op() for container types such as
sprod has two other nice side effects:
-
has()works as expected -
GiNaC generates better hash keys for the objects (the default implementation
of
calchash()takes subexpressions into account)
There is a non-const variant of op() called let_op() that
allows replacing subexpressions:
ex & sprod::let_op(size_t i)
{
// every non-const member function must call this
ensure_if_modifiable();
switch (i) {
case 0:
return get_struct().left;
case 1:
return get_struct().right;
default:
throw std::range_error("sprod::let_op(): no such operand");
}
}
|
Once we have provided let_op() we also get subs() and
map() for free. In fact, every container class that returns a non-null
nops() value must either implement let_op() or provide custom
implementations of subs() and map().
In turn, the availability of map() enables the recursive behavior of a
couple of other default method implementations, in particular evalf(),
evalm(), normal(), diff() and expand(). Although
we probably want to provide our own version of expand() for scalar
products that turns expressions like ‘<a+b|c>’ into ‘<a|c>+<b|c>’.
This is left as an exercise for the reader.
The structure<T> template defines many more member functions that
you can override by specialization to customize the behavior of your
structures. You are referred to the next section for a description of
some of these (especially eval()). There is, however, one topic
that shall be addressed here, as it demonstrates one peculiarity of the
structure<T> template: archiving.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
