In this section, we will analyze the possibility of using the Visitor pattern at compile time, in a similar fashion to, say, the application of the Strategy pattern that leads to policy-based design.
First of all, the multiple dispatch aspect of the Visitor pattern becomes trivial when used in the template context:
template <typename T1, typename T2> auto f(T1 t1, T2 t2);
A template function can easily run a different algorithm for any combination of the T1 and T2 types. Unlike the run-time polymorphism implemented with the virtual functions, dispatching the call differently based on two or more types comes at no extra cost (other than writing the code for all the combinations we need to handle, of course). Based on this observation, we can easily mimic the classic Visitor pattern at compile time:
class Pet {
std::string color_;
public:
Pet...