C++ fftw3的常数正确性 总结

C++ fftw3的常数正确性 总结,c++,constants,well-formed,C++,Constants,Well Formed,如果外部库的函数需要一个非常量指针(double*),但已知它的值保持不变,那么根据常量的正确性,我应该传递一个常量指针(const double*) 形势 我想创建一个函数来计算向量的自相关性,但不幸的是,(这是一个C API)似乎并不关心常量的正确性。 我想调用的函数是: fftw_plan fftw_plan_dft_r2c_1d(int n0, double *in, fftw_complex *out,

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

形势 我想创建一个函数来计算向量的自相关性,但不幸的是,(这是一个C API)似乎并不关心常量的正确性。 我想调用的函数是:

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;
}
向量自相关(常量向量和数据)
{
向量ret(data.size(),0);
//准备其他变量
fftw_plan a=fftw_plan_dft_r2c_1d(大小和数据.front(),tmp,fftw_估算);
//做剩下的工作
返回ret;
}

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

如果您遇到一个C API,它在
const
-正确性方面的承诺比它显示的要多,那么是时候
const\u 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;
}
向量自相关(常量向量和数据)
{
向量ret(data.size(),0);
//准备其他变量
fftw_plan a=fftw_plan_dft_r2c_1d(大小、常数转换(&data.front())、tmp、fftw_估算值);
//做剩下的工作
返回ret;
}
还应注意以下内容中的这句话:

in和out指向变换的输入和输出数组,它们可能相同(生成就地变换)。除非在标志中使用FFTW_估计值,否则在规划期间将覆盖这些数组

由于您使用的是
FFTW\u ESTIMATE
标志,因此在这种情况下您应该不会有问题


FFTW开发人员决定不为了
const
而复制此函数的原因是,在C中,
const
一点都不重要,FFTW是一个C库。

首先针对库提交一个bug报告,然后
const\code>消除
和data.front()的const,例如
const\code>(&data.front())

快速而肮脏的解决方案:如果确定函数中的数据没有更改,可以将其强制转换为非常量:而不是&data.front()使用(常量双*)&data.front().我不想只使用一个小C代码就破坏我代码的常量正确性。当维护一个大代码时,这些小事情可能会非常令人不安。