#includeclass SlotVisitor { public: virtual void visit(const int& data) = 0; virtual void visit(const double& data) = 0; }; class MyClass { public: int myInt; double myDouble; void accept(SlotVisitor& visitor) { visitor.visit(myInt); visitor.visit(myDouble); } }; class PrintVisitor : public SlotVisitor { public: void visit(const int& data) override { std::cout << "Integer: " << data << std::endl; } void visit(const double& data) override { std::cout << "Double: " << data << std::endl; } }; int main() { MyClass obj; obj.myInt = 42; obj.myDouble = 3.14; PrintVisitor printer; obj.accept(printer); return 0; }
#includeDescription: In this example, we use the Boost Variant library to define a variant type MyVariant that can hold either an int or a double. We define a MyClass with a vector of MyVariants and an accept() method that applies the visitor to each element of the vector using the apply_visitor() function. We define a PrintVisitor that inherits from boost::static_visitor and implements the operator() methods for each data type to print the data to the console. We create an instance of MyClass and call the accept() method with the PrintVisitor to print both data types to the console. Package library: The SlotVisitor pattern belongs to the Boost C++ Libraries package.#include class SlotVisitor { public: virtual void visit(const int& data) = 0; virtual void visit(const double& data) = 0; }; typedef boost::variant MyVariant; class MyClass { public: std::vector myData; void accept(SlotVisitor& visitor) { for (auto&& data : myData) { boost::apply_visitor(visitor, data); } } }; class PrintVisitor : public boost::static_visitor<> { public: void operator()(const int& data) const { std::cout << "Integer: " << data << std::endl; } void operator()(const double& data) const { std::cout << "Double: " << data << std::endl; } }; int main() { MyClass obj; obj.myData.push_back(42); obj.myData.push_back(3.14); PrintVisitor printer; obj.accept(printer); return 0; }