3

我有一个有趣的想法,即使用函子创建一种向量表。然而,经过进一步分析,这似乎是一个白日梦,因为它会非常昂贵,因为必须生成整个表才能从调用函子的函数中传递一些函数参数。在这种情况下,仿函数将充当代理来管理仿函数调用的函数之间的参数差异。

迷茫了吗?:-) 例子:

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

当要调度的函数数量很少时,这不是什么大问题,但随着数量的增加,情况会变得越来越糟。

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

还要编辑,编译器将如何处理这个?它会导致多个调用堆栈条目(对仿函数的调用,然后对目标函数的调用)还是与开关一样有效?

4

1 回答 1

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;
}
于 2013-10-09T15:43:06.760 回答