Надеюсь, это поможет!
Шаблон посетителей будет лучше, если: 1 - по какой-то причине вы хотите разделить операции doA и doB на разные классы;2 - Ваши классы X86_Op_A, X86_Op_B, Arm_Op_A, Arm_Op_B имеют другие методы, и вы не хотите, чтобы операции doA и doB были вместе с этими методами;
class X86_Op_A;
class X86_Op_B;
class Arm_Op_A;
class Arm_Op_B;
class OpVisitor
{
public:
OpVisitor();
virtual ~OpVisitor();
public:
virtual void visit(X86_Op_A*) = 0;
virtual void visit(X86_Op_B*) = 0;
virtual void visit(Arm_Op_A*) = 0;
virtual void visit(Arm_Op_B*) = 0;
};
#include "OpVisitor.h"
#include "vector"
#include "iostream"
class DoAVisitor :
public OpVisitor
{
public:
DoAVisitor(std::vector<int>& vec): m_vec(vec)
{
}
virtual ~DoAVisitor();
public:
virtual void visit(X86_Op_A*)
{
std::cout << "genereate A type operator that do something under x86" << "\n";
}
virtual void visit(X86_Op_B*)
{
std::cout << "genereate B type operator that do something under x86" << "\n";
}
virtual void visit(Arm_Op_A*)
{
std::cout << "genereate A type operator that do something under Arm" << "\n";
}
virtual void visit(Arm_Op_B*)
{
std::cout << "genereate B type operator that do something under x86" << "\n";
}
protected:
std::vector<int>& m_vec;
};
#include "OpVisitor.h"
#include "iostream"
#include "unordered_map"
class DoBVisitor :
public OpVisitor
{
public:
DoBVisitor(std::unordered_map<int, int>& map): m_map(map)
{
}
virtual ~DoBVisitor();
public:
virtual void visit(X86_Op_A*)
{
std::cout << "genereate A type operator that do something under x86" << "\n";
}
virtual void visit(X86_Op_B*)
{
std::cout << "genereate B type operator that do something under x86" << "\n";
}
virtual void visit(Arm_Op_A*)
{
std::cout << "genereate A type operator that do something under Arm" << "\n";
}
virtual void visit(Arm_Op_B*)
{
std::cout << "genereate B type operator that do something under x86" << "\n";
}
protected:
std::unordered_map<int, int>& m_map;
};
#include "Op.h"
#include "OpVisitor.h"
class X86_Op_A :
public Op
{
public:
X86_Op_A();
virtual ~X86_Op_A();
public:
virtual void Accept(OpVisitor& v)
{
v.visit(this);
}
};
#include "Op.h"
#include "OpVisitor.h"
class X86_Op_B :
public Op
{
public:
X86_Op_B();
virtual ~X86_Op_B();
public:
virtual void Accept(OpVisitor& v)
{
v.visit(this);
}
};
#include <iostream>
#include "X86_Op_A.h"
#include "DoAVisitor.h"
#include "vector"
int main()
{
X86_Op_A var;
std::vector<int> vec;
DoAVisitor visitor(vec);
var.Accept(visitor);
std::cout << "Hello World!\n";
}