Я согласен с использованием массива, но у меня нет репутации, чтобы голосовать за него. Это всего 65536 записей, поэтому, если у вас нет серьезных ограничений памяти и / или вы возвращаете что-то очень большое, вместо int, как в вашем примере, вам будет намного лучше использовать статический константный массив. Массив из 64 тыс. Целых, как правило, составляет всего 256 КБ, и он будет вдвое меньше, чем 1/4, если вы можете использовать short или char. Я думаю, что лучшее, на что вы можете надеяться с помощью оператора switch - это условная ветвь для значений вне массива указателей кода и вторая условная ветвь для перехода к коду для значения внутри массива. Возможность просто выполнить «return my_array [value]» просто приведет к извлечению памяти (возможно, из кэша l3).
Для удобства чтения вы можете поместить массив в отдельный файл и выстроить все значения в сетке примерно в 10 или 16 записей в строке. Затем вы комментируете каждую строку первой частью каждого номера записи (например, "// 0x12A?"), И у вас есть периодические строки комментариев, которые будут выровнены со столбцами, чтобы заполнить последнюю цифру для номера записи (например, "// 0 1 2 3 4 5 6 7 8 9 ABCDEF "). Я сделал это для нескольких массивов из 256 записей, которыми было намного легче управлять, чем оператором switch. Я также использовал массивы с записями 64 КБ для быстрых целочисленных логарифмов, которыми сложнее управлять, но я смог написать программу для генерации всего кода массива.
С чем-то большим, управление кодом может быть не простым, пока вы не разберетесь с большим количеством записей, но это зависит от вашего редактора и навыков работы с ним. Поддерживать такой массив - это просто корректировать место на графике, а не искать значения, которые могут быть или не быть в длинном списке «case 1: return const_1;». Пару циклов for должно быть достаточно для генерации массива из 64 тыс. Записей, которые правильно прокомментированы и заполнены значениями по умолчанию.
В целях безопасности доступа вы можете рассмотреть возможность проверки границ. Это можно сделать с помощью предварительных условий boost, выбрасывая исключение или специальный возврат, если число выходит за границы, или просто «return my_array [value & 0xffff]». Тем не менее, у вас может быть достаточно сильная гарантия на входящую ценность, которая вам не нужна.