callback vs lambda
callback vs lambda
假设我有以下希望重构的代码:
int toFuture()
{
precalc();
int calc = 5 * foobar_x() + 3;
postcalc();
return calc;
}
int toPast()
{
precalc();
int calc = 5 * foobar_y() - 9;
postcalc();
return calc;
}
在classic-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++ 11特性的模板方法,可以像下面这样简单:
template<typename FuncType>
auto calculation(FuncType&& func) -> decltype(func())
{
precalc();
auto ret = func();
postcalc();
return ret;
}
你只需调用你的calculation
函数并传递给它一个lambda、一个函子或一个函数指针。在这种情况下,您唯一的困难来源是如果您传递了一个具有void
返回类型的函数……在这种情况下,您将得到一个编译器错误(这是一件好事,而不是运行时错误)。
我觉得你重构的方向错了:
struct CalcGuard {
CalcGuard() { /* replaces precalc() */ }
~CalcGuard() { /* replaces postcalc() */ }
};
int toFuture()
{
return CalcGuard(), calc = 5 * foobar_x() + 3;
}
int toPast()
{
return CalcGuard(), calc = 5 * foobar_y() - 9;
}
有一种C/C++
方法可以做到这一点,还有一种C++11
方法。这两种方式都不涉及lambda或模板。
C/C++
方式:
double MyFunc (int x, float y) { return x + y ; }
int main()
{
double (*pf) (int, float) ;
pf = MyFunc ;
pf (101, 202.0) ;
}
C++11
方式:
#include <functional>
double MyFunc (int x, float y) { return x + y ; }
int main()
{
std::function<double (int, float)> f ;
f = MyFunc ;
f (51, 52.0) ;
}
无论哪种情况,您只需将pf
或f
作为参数传递给重构函数。在这里使用lambdas或模板是多余的。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 可组合的lambda/std::函数与std::可选
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 模板lambda vs foundor带有模板操作员()
- c++ goto vs std::function lambda?
- 在折叠表达式中使用 lambda 时"Uninitialized captured reference"错误 - clang vs gcc
- 崩溃当std ::函数是从lambda返回的VS 2012中返回的值时的崩溃
- VS Express 2012 C++ lambda 智能感知错误
- 在非“constexpr”上下文中的“constexpr”函数中使用lambda:clang vs gcc
- C++ VS 2013 中的 11 lambda 回调无法编译
- Lambda VS Function
- GCC vs clang -使用' make_overload '可变lambda继承时的模糊重载
- Clang vs空泛型lambda可变参数包
- Lambda vs排序函数
- std::bind vs lambda performance
- callback vs lambda
- 无法在VS 14 CTP中使用auto声明lambda:类型为'void'的条件表达式是非法的
- Lambda函数捕获变量vs返回值