Defining Visitors - GerdHirsch/Cpp-VisitorFrameworkCyclicAcyclic GitHub Wiki

next

To define a Visitor you can either use visits<typelist> to inherit from or specify a list of types visits<E1, E2, NonVisitable> with the types you want to visit. The list must be a subset of the types of your Repository other types can not be visited.

#include "MyRepository.h"

class DemoVisitor : public Repository::visits<typelist>{
//class DemoVisitor : public Repository::visits<E1, NonVisitable>{
public:
    std::string toString() const override { return "DemoVisitor"; }

    void visit(E1& v) {
        std::cout << toString() << "::visit(" << v.toString() << ")" << std::endl;
    }
    void visit(NonVisitable& v) {
        std::cout << toString() << "::visit(" << v.toString() << ")" << std::endl;
    }
//void visit(E2& v) {
//	std::cout << toString() << "::visit(" << v.toString() << ")" << std::endl;
//}
};

Constraints to Visitors: it´s not allowed to store Visitables out of the scope of the corresponding visit method. Using Visitable v outside is undefined behaviour, the references may dangle.

If you use an acyclic Visitor, your Visitor inherits only the VisitorInterfaces of the specified types in the list of Repository::visits<...>.

If you use an cyclic Visitor, the types in the list are just ignored, cause cyclic visitors have a common base class, with a visit method for each element to be visited, either abstract or with a default implementation.

If you specify BaseKind::Default in the Repository, you don't have to provide a visit(..) method for all Types in the typelist, but only for Types you realy want to visit. The Framework provides a default visit(..) method that uses the specified DefaultPolicy.

see also: SwitchCyclicAcyclicVisitors.h

next

⚠️ **GitHub.com Fallback** ⚠️