我有一个有趣的想法,即使用函子创建一种向量表。然而,经过进一步分析,这似乎是一个白日梦,因为它会非常昂贵,因为必须生成整个表才能从调用函子的函数中传递一些函数参数。在这种情况下,仿函数将充当代理来管理仿函数调用的函数之间的参数差异。
迷茫了吗?:-) 例子:
#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 只会跳转到所需的那个。
当要调度的函数数量很少时,这不是什么大问题,但随着数量的增加,情况会变得越来越糟。
如果我能以某种方式推迟仿函数对象的创建直到它被调用,那将是最佳的。那可能吗?
还要编辑,编译器将如何处理这个?它会导致多个调用堆栈条目(对仿函数的调用,然后对目标函数的调用)还是与开关一样有效?