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