BOOST_OPENMETHOD_OVERRIDE
Synopsis
Defined in <boost/openmethod/macros.hpp>.
BOOST_OPENMETHOD_OVERRIDE(ID, (PARAMETERS...), RETURN_TYPE) {
// body
}
Description
BOOST_OPENMETHOD_OVERRIDE adds an overrider to a method.
ID is the identifier of the method to which the overrider is added.
ID must be an identifier. Qualified names are not allowed.
|
PARAMETERS is a comma-separated list of types, possibly followed by parameter
names, just like in a function declaration.
The macro tries to locate a method that can be called with the same argument list as the overrider, possibly via argument dependent lookup.
Each virtual_ptr<T> in the method’s parameter list must have a corresponding
virtual_ptr<U> parameter in the same position in the overrider’s parameter
list, such that U is the same as T, or has T as an accessible unambiguous
base.
Each virtual_<T> in the method’s parameter list must have a corresponding U
parameter in the same position in the overrider’s parameter list, such that U
is the same as T, or has T as an accessible unambiguous base.
The following names are available inside the overrider’s body:
-
fn: a pointer to a function, the overrider itself. Can be used for recursion. -
next: a function with the same signature as the method (minus thevirtual_<>decorators). It forwards to the next most specialized overrider, if it exists and it is unique. If the next overrider does not exist, or is ambiguous, callingnextreports ano_overrideror aambiguous_calland terminates the program. -
has_next(): returnstrueif the next most specialized overrider exists.
Implementation Notes
The macro creates additional entities in the current scope.
-
A class template declaration that acts as a container for the method’s overriders in the current scope:
template<typename...> struct BOOST_OPENMETHOD_OVERRIDERS(NAME);
-
A specialization of the container for the overrider:
struct BOOST_OPENMETHOD_OVERRIDERS(ID)<RETURN_TYPE(PARAMETERS...)> { static auto fn(PARAMETERS...) -> RETURN_TYPE; static auto has_next() -> bool; template<typename... Args> static auto next(typename... Args) -> RETURN_TYPE; };-
A registrar adding the overrider to the method.
-
Finally, the macro starts the definition of the overrider function:
-
auto BOOST_OPENMETHOD_OVERRIDERS(ID)<RETURN_TYPE(PARAMETERS...)>::fn(
PARAMETERS...) -> RETURN_TYPE
The {} block following the call to the macro is the body of the function.