Я пытаюсь создать JVM. Во-первых, у меня есть вектор с кодами операций и строками, которые их представляют. Это инициализируется так:
Opcodes::Opcodes():
opcodes(0xff + 1, "Not implemented")
{
opcodes[0x2A] = "aload_0";
opcodes[0x2B] = "aload_1";
opcodes[0x2C] = "aload_2";
opcodes[0x2D] = "aload_3";
opcodes[0xB7] = "invokespecial";
}
Учитывая код операции, я хочу напечатать его, это код до сих пор:
std::string Opcodes::getString(u1 opcode)
{
try
{
return Opcodes::getInstance().opcodes.at(opcode);
}
catch (const std::out_of_range &e)
{
return "Opcode too large";
}
}
void Opcodes::printCode(std::ostream& out, u1 code[], u4 codeLength)
{
for (u4 i = 0; i < codeLength; i++)
{
out << Opcodes::getString(code[i]) << std::endl;
}
}
Будет много кодов операций. Для многих кодов операций мне просто нужно получить код операции и распечатать его. Но для других я должен использовать другой подход, например, в методе printCode () , если я читаю код операции invokespecial , я должен напечатать два следующих кода операции в коде массив ( code [] ) иначе, чем просто взять его из вектора кодов операций или просто игнорировать их (не печатать).
Как я могу сделать это хорошим способом ? Что может быть хорошим подходом для этого?
Я мог бы просто использовать , если или switch , но это будет действительно , если Я не думаю, что это хорошо, звучит грязно. Я думал об использовании лямбда как-нибудь. Я слышал о шаблоне под названием command , возможно, он может быть полезен. Что ты думаешь?