C++中的匿名函数
代码解析
auto getTicks = [](QCPAxis *axis) -> QList<double> {
QList<double> ticks;
if(auto ticker = static_cast<QCPAxisTickerFixed *>(axis->ticker().data()))
{
double current = axis->range().lower;
const double step = ticker->tickStep();
while(current <= axis->range().upper + 1e-6)
{ // 处理浮点精度
ticks.append(current);
current += step;
}
}
return ticks;
};
1. Lambda 表达式的定义
auto getTicks = [](QCPAxis *axis) -> QList<double> {
...
};
auto getTicks:定义了一个名为getTicks的变量,其类型由编译器自动推导。[]:表示这是一个 lambda 表达式。(QCPAxis *axis):lambda 表达式的参数列表,表示它接受一个QCPAxis类型的指针。-> QList<double>:返回类型,表示这个 lambda 表达式返回一个QList<double>类型的值。
2. Lambda 表达式的主体
QList<double> ticks;
if(auto ticker = static_cast<QCPAxisTickerFixed *>(axis->ticker().data()))
{
double current = axis->range().lower;
const double step = ticker->tickStep();
while(current <= axis->range().upper + 1e-6)
{ // 处理浮点精度
ticks.append(current);
current += step;
}
}
return ticks;
QList<double> ticks;:定义了一个QList<double>类型的变量ticks,用于存储计算得到的刻度值。if(auto ticker = static_cast<QCPAxisTickerFixed *>(axis->ticker().data())):axis->ticker().data():获取QCPAxis的ticker属性,这是一个QSharedPointer<QCPAxisTicker>。static_cast<QCPAxisTickerFixed *>(...):将QCPAxisTicker指针强制转换为QCPAxisTickerFixed指针。auto ticker:使用auto关键字自动推导变量类型,这里推导为QCPAxisTickerFixed *。
double current = axis->range().lower;:获取轴的范围下限。const double step = ticker->tickStep();:获取刻度步长。while(current <= axis->range().upper + 1e-6):循环计算刻度值,直到超过轴的范围上限。1e-6是一个小的浮点数,用于处理浮点数精度问题。ticks.append(current);:将当前刻度值添加到ticks列表中。current += step;:将当前刻度值增加一个步长。return ticks;:返回计算得到的刻度值列表。
作用
这个 lambda 表达式的作用是:给定一个 QCPAxis 对象,计算并返回该轴的刻度值列表。它通过 QCPAxisTickerFixed 的 tickStep 方法获取刻度步长,并在轴的范围内生成刻度值。
使用示例
假设你有一个 QCPAxis 对象 axis,你可以这样使用这个 lambda 表达式:
QList<double> ticks = getTicks(axis);
这将调用 getTicks lambda 表达式,计算并返回 axis 的刻度值列表。
