#include <iostream>#include<string>#include<string.h>#include<memory>#include<thread>#include<Windows.h>#include<future>using namespacestd;template<typename ... Types>structvisitor;template<typename T, TypeName ... Types>structVisitor<t, types...>: visitor<types...>{ usingVisitor<types...>:: Visit; Virtual voidVisit (Constt&) =0;}; Template<typename t>structVisitor<t>{ Virtual voidVisit (Constt&) =0;};structStA;structStB;structbase{typedef Visitor<sta, stb>Myvisitor; Virtual voidAccept (myvisitor&) =0;};structsta:base{DoubleVal; voidAccept (base::myvisitor&v) {v.visit (* This); }};structstb:base{DoubleVal; voidAccept (base::myvisitor&v) {v.visit (* This); }};structprintvisitor:base::myvisitor{voidVisit (Conststa&a) {cout<<"From StA:"<< A.val <<Endl; } voidVisit (Conststb&b) {cout<<"From StB:"<< B.val <<Endl; }};intMain () {Printvisitor vis; StA A; A.val=8.97; StB b; B.val=8; Base*Base= &A; Base-Accept (VIS); Base= &b; Base-Accept (VIS); GetChar (); return 0;}
C++11 Visitor Mode