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
的刻度值列表。