Поскольку переключение выполняется для байта (и, следовательно, оно имеет 256 различных значений; я уверен, что MIDI-файлы основаны на 8-битных байтах), лучшим вариантом, вероятно, является использование простого массива указателей на функции:
typedef void (*MidiAction)(MidiMessageType& message);
action_fader_1(MidiMessageType& message)
{
std::cout << "Fader 1 Value : " << message.get3rdByte() << std::endl;
}
action_fader_2(MidiMessageType& message)
{
std::cout << "Fader 2 Value : " << message.get3rdByte() << std::endl;
}
...
MidiAction midi_actions[256] = {
/* 0 */ action_whatever,
/* 1 */ action_fader_1,
/* 2 */ action_fader_2,
...
/* 10 */ action_button_1,
...
};
...
// this goes where your switch statement was:
midi_actions[MidiAction.get2ndByte()](MidiAction);
Этот массив просто использует 1 КБ (32-разрядные платформы) или 2 КБ (64-разрядные платформы), обеспечивает гарантированный поиск в постоянном времени, не имеет скрытых накладных расходов, и, возможно, ваш компилятор реализует ваш большой оператор switch внутри как таблицу поиска в любом случае (так накладные расходы, которые вы получаете, это дополнительный вызов функции).
Обратите внимание, что при наличии недопустимых байтовых значений запись массива должна указывать на явную функцию ошибки (вместо простого 0), чтобы ваша программа могла корректно обработать ошибку.