0

概括

如果外部库的函数需要一个非常量指针(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 正确性的最合适的解决方案是什么?

4

2 回答 2

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;
}

还要注意文档中的这句话:

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

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

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

于 2014-04-22T15:15:28.850 回答
1

首先针对库提交错误报告,然后const_cast消除 的 const-ness &data.front(),例如const_cast<double*>(&data.front())

于 2014-04-22T15:15:36.060 回答