У меня возникла интересная идея создания типа векторной таблицы с использованием функторов. Однако после дальнейшего анализа казалось бы, что это было бы мечтой из-за того, что это было бы непомерно дорогостоящим, поскольку всю таблицу нужно было бы сгенерировать, чтобы передать некоторые из параметров функции из функции, которая вызывает функтор. Функтор в этом случае будет действовать как прокси-сервер для управления разностями параметров между функциями, которые вызывает функтор.Можно ли отложить генерацию функтора?
Confused еще? :-) Пример:
#include <functional>
class classA {};
void fn1(int a);
void fn2(classA& a);
void fn_x(int fn_to_call, int a1, classA& a2) {
std::function<void()> vtable[] = {
[&]{ fn1(a1); },
[&]{ fn2(a2); }
};
vtable[fn_to_call]();
}
void fn_y(int fn_to_call, int a1, classA& a2) {
switch(fn_to_call) {
case 0:
return fn1(a1);
case 1:
return fn2(a2);
}
}
Для краткости я пропустил чеки, когда я делаю это по телефону.
Так как я понимаю, fn_x должен был бы создать массив функторов при вводе функции, а затем вызвать требуемую. В то время как fn_y просто прыгнет на требуемый.
Когда количество функций для отправки невелико, это не большая проблема, но по мере увеличения числа он становится все хуже и хуже.
Если бы я мог как-то отложить создание объектов-функторов до тех пор, пока он не будет вызван, это было бы оптимальным. Это возможно?
Редактировать также, как будет обрабатывать компилятор? Будет ли результатом несколько записей стека вызовов (вызов функтора, а затем вызов целевой функции), или это будет так же эффективно, как и переключатель?
где определен 'function'? – Oswald
@ Освальд: Я бы поставил на 'std'. –
@Adrian: Если они были простыми указателями на функции, массив может быть статическим (обратите внимание, что лямбда, которая не фиксирует ничего, конвертируется в обычный указатель функции соответствующего типа). Чем это будет просто записано в исполняемый файл компилятором без каких-либо затрат времени на выполнение. –