Я пытаюсь реализовать быстрый диспетчер функций, используя сгенерированные во время компиляции массивы, чтобы иметь возможность использовать его во время выполнения в O (1).
Некоторые строки кода, чтобы уточнить:
template<int i>
void f()
{
// do stuff
}
// specialized for every managed integer
template<>
void f<1>
{
// do stuff
}
Dispatcher<1,5,100,300> dispatcher;
dispatcher.execute(5); // this should call f<5>()
Назовем N числом входов диспетчера (в данном случае 4), а M максимальным значением входа диспетчера (300) в этом случае.
Я смог заставить его работать, создавая массив с размером, равным M. Это использует тот факт, что во время выполнения вы можете сделать что-то вроде:
dispatcher.execute(5) -> internalArray[5]();
Конечно, это работает, но для массивов больших размеров это невозможно.
Лучше всего было бы создать массив только из N элементов и выполнить математический трюк для преобразования входного индекса в индекс второго массива.
В этом примере что-то, что переводит 1,5,100,300 соответственно в 0,1,2,3. Я смог сделать своего рода метод предварительной обработки, чтобы преобразовать их, но я ищу способ избежать этого шага.
Другими словами, я думаю, что я ищу какое-то минимальное идеальное хеширование, которое можно очень эффективно использовать во время компиляции для моего конкретного случая (в идеале без каких-либо накладных расходов, что-то вроде: goto: MyInstruction).
Я не ищу альтернатив, которые используют виртуальные функции, std :: map или сложные операции.
Пожалуйста, спросите, если что-то не ясно.
PS Я использую C ++ 11, но любая идея приветствуется
[Edit] Мне известны метки как расширение языка значений GCC. С теми, кого я, возможно, смог бы достичь своей цели, но мне нужно портативное решение.