是否可以推迟仿函数的生成?

时间:2013-10-09 14:13:04

标签: c++ c++11

我有一个使用仿函数创建一种矢量表的有趣想法。然而,在进一步分析之后,似乎这将是一个梦想,因为它将非常昂贵,因为必须生成整个表以传递来自的一些函数参数调用仿函数的函数。在这种情况下,仿函数将充当代理来管理仿函数调用的函数之间的参数差异。

困惑了吗? :-)示例:

#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只会跳到所需的那个。

当发送的功能数量很少时,这不是一个问题,但随着数量的增加,它会变得越来越糟。

如果我可以以某种方式推迟创建仿函数对象直到它被调用,那将是最佳的。这可能吗?

编辑,编译器将如何处理此问题?它会导致多个调用堆栈条目(调用仿函数然后调用目标函数)还是会像切换一样有效?

1 个答案:

答案 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;
}