c++ - 回调与 lambda

标签 c++ lambda c++11

假设我有以下想要重构的代码:

int toFuture()
{
  precalc();
  int calc = 5 * foobar_x() + 3;
  postcalc();
  return calc;
}

int toPast()
{
  precalc();
  int calc = 5 * foobar_y() - 9;
  postcalc();
  return calc;
}

在经典-C中,我会将这段代码重构为一个worker(),它接受一个执行计算的函数指针:worker()中的通用代码,函数指针提供的特定代码。

对于 C++11,我应该改用 lambda 吗?如果是这样,在这种情况下我将如何实现它?

编辑:我突然想到模板也可以工作。模板实现与其他两个实现相比如何?

最佳答案

一种方法:

template<typename CalcFuncT>
int perform_calc(CalcFuncT&& calcfunc)
{
    precalc();
    int const calc = std::forward<CalcFuncT>(calcfunc)();
    postcalc();
    return calc;
}

int main()
{
    perform_calc([]{ return 5 * foobar_x() + 3; }); // toFuture
    perform_calc([]{ return 5 * foobar_y() - 9; }); // toPast
}

关于c++ - 回调与 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7828675/

相关文章:

C++11 : Atomic variable : lock_free property : What does it mean?

c++ - 部署时窗口下的qtcreator托盘图标不显示

c# - 转换或简化具有已知值的表达式

c# - 为 lambda 声明提供的参数数量不正确

c++ - std::thread 构造函数(变量数量)

c++ - reinterpret_cast 不会改变指针的值是真的吗?

c++ - 如何维护自制库?

c++ - std::equal_range 与 lambda

c++ - 使用 C++11 配置 Eclipse

c++ - 在 for 循环中声明两个不同的变量,其中一个是不可移动、不可复制的对象