|
|
Implementation of multimethods. Insipred/copied from Alexandrescu [Modern C++ Design].
By taking base element arguments and an operation, it will execute the correct operation based on the concrete type of the arguments.
typedef vector<const Element*> ArgList | ArgList |
Dispatcher ()
| Dispatcher |
OpNotFound (class) | OpNotFound |
If there is no combination for the given operation and element types.
template<class L, class R, Element* (*funct)(const L&,const R&)>
void
add (const BinOper& op)
| add |
Method to register a binary operation callback with dispatcher.
Parameters:
L | concrete class of first argument |
R | concrete class of second argument |
funct | function to be called to perform operation. |
op | cinary operation to be registered. |
template<class T, Element* (*funct)(const T&)>
void add (const UnOper& op)
| add |
Method to register a unary operation callback with dispatcher.
Parameters:
T | concrete class of argument |
funct | function to be called to perform operation. |
op | unary operation to be registered. |
Element* run (const Oper& op, const ArgList& args)
| run |
[const]
Execute an n-ary operation.
Throws an exception on failure.
Parameters:
op | operation to dispatch. |
args | arguments of operation. |
Returns: result of operation.
Element* run (const UnOper& op, const Element& arg)
| run |
[const]
Execute an unary operation.
Parameters:
op | Operation to perform. |
arg | Argument of operation. |
Returns: Result of operation. Caller is responsible for delete.
Element* run (const BinOper& op,
const Element& left,
const Element& right)
| run |
[const]
Execute a binary operation.
Parameters:
op | Operation to perform. |
left | first argument. |
right | second argument. |
Returns: result of operation. Caller is responsible for delete.