我有一个使用仿函数创建一种矢量表的有趣想法。然而,在进一步分析之后,似乎这将是一个梦想,因为它将非常昂贵,因为必须生成整个表以传递来自的一些函数参数调用仿函数的函数。在这种情况下,仿函数将充当代理来管理仿函数调用的函数之间的参数差异。
困惑了吗? :-)示例:
#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只会跳到所需的那个。
当发送的功能数量很少时,这不是一个问题,但随着数量的增加,它会变得越来越糟。
如果我可以以某种方式推迟创建仿函数对象直到它被调用,那将是最佳的。这可能吗?
编辑,编译器将如何处理此问题?它会导致多个调用堆栈条目(调用仿函数然后调用目标函数)还是会像切换一样有效?
答案 0 :(得分:2)
为了总结一下评论中的一些建议,为什么不创建一组知道如何转发参数的仿函数?
#include <functional>
class classA {};
void fn1(int a) {}
void fn2(classA& a) {}
void fn_x(int fn_to_call, int a1, classA& a2) {
using namespace std::placeholders;
static std::function<void(int, classA&)> vtable[] = {
std::bind(&fn1, _1),
std::bind(&fn2, _2),
};
vtable[fn_to_call](a1, a2);
}
int main()
{
classA a;
fn_x(0, 3, a);
fn_x(1, 3, a);
return 0;
}