fftw3的const正确性

时间:2014-04-22 15:10:13

标签: c++ const well-formed

摘要

如果外部库的函数需要非常量指针(double *),但我知道它的值保持不变,那么根据const的正确性我应该传递一个const指针,该怎么办? (const double *)?

情况

我想创建一个计算向量自相关的函数,但不幸的是fftw3(它是一个C API)似乎并不关心const的正确性。 我想打电话的功能是:

fftw_plan fftw_plan_dft_r2c_1d(int n0,
                                    double *in, fftw_complex *out,
                                    unsigned flags);

我要创建的代码:

vector<double> autocorr(const vector<double>& data)
{
    vector<double> ret(data.size(), 0);
    // prepare other variables
    fftw_plan a = fftw_plan_dft_r2c_1d(size, &data.front(), tmp, FFTW_ESTIMATE);
    // do the rest of the work
    return ret;
}

当然,这不起作用,因为我的函数的参数是const vector<double>& data所以我不能调用&data.front()。保持代码的const正确性的最合适的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

如果您遇到的C API承诺的价格高于const - 正确性,则需要const_cast

vector<double> autocorr(const vector<double>& data)
{
    vector<double> ret(data.size(), 0);
    // prepare other variables
    fftw_plan a = fftw_plan_dft_r2c_1d(size, const_cast<double*>(&data.front()), tmp, FFTW_ESTIMATE);
    // do the rest of the work
    return ret;
}

另请注意documentation中的这句话:

  

in和out指向变换的输入和输出数组,它们可以是相同的(产生就地变换)。除非在标志中使用FFTW_ESTIMATE,否则在规划期间会覆盖这些数组。

由于您使用的是FFTW_ESTIMATE标记,因此在这种情况下您应该没问题。

为了const,FFTW开发人员决定不复制此函数的原因是,在C中,const并不是什么大问题,而FFTW是一个C库。

答案 1 :(得分:1)

首先提交针对该库的错误报告,然后const_cast远离&data.front()的常量,例如const_cast<double*>(&data.front())