boost::openmethod::boost_openmethod_vptr
Return the v‐table pointer of an object (ADL customization point).
Synopsis
Declared in <boost/openmethod/core.hpp>
void
boost_openmethod_vptr(...);
Description
This declaration is a catch‐all that matches any argument list and returns void, denoting the absence of customization. If an overload beats it for a given argument type and registry, that overload is used to acquire a v‐table pointer instead of the registry's policies::vptr policy.
The library uses boost_openmethod_vptr, if found, when dispatching via a virtual_ parameter. It is not used by virtual_ptr; wrapping an object that has an overload in a virtual_ptr is rejected at compile time.
Requirements
The library uses argument‐dependent lookup to find an overload that satisfies the following requirements:
-
The first parameter is a
constlvalue reference to the virtual argument. -
The second parameter is a pointer to a registry. Its role is to pass the registry's class to the overload. It must not be dereferenced ‐ its value is
nullptr. It may instead bevoid*if the overload does not need the registry. -
The return type is
vptr_type.
Example
Animal carries its v‐table pointer, and is registry‐agnostic:
class Animal {
protected:
boost::openmethod::vptr_type vptr;
friend auto boost_openmethod_vptr(const Animal& a, void*) {
return a.vptr;
}
public:
Animal() {
vptr = boost::openmethod::default_registry::static_vptr<Animal>;
}
};
class Cat : public Animal {
public:
Cat() {
vptr = boost::openmethod::default_registry::static_vptr<Cat>;
}
};
BOOST_OPENMETHOD(poke, (std::ostream&, virtual_<Animal&>), void);
BOOST_OPENMETHOD_OVERRIDE(poke, (std::ostream & os, Cat& /*cat*/), void) {
os << "hiss\n";
}
BOOST_OPENMETHOD_CLASSES(Animal, Cat);