Что я могу сделать, если функция внешней библиотеки ожидает неконстантный указатель (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()
, Какое решение является наиболее подходящим для сохранения правильности моего кода?
Если вы столкнулись с 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;
}
Также обратите внимание на это предложение в документация:
точки входа и выхода указывают на входные и выходные массивы преобразования, которые могут быть одинаковыми (в результате получается преобразование на месте). Эти массивы перезаписываются во время планирования, если в флагах не используется FFTW_ESTIMATE.
Поскольку вы используете FFTW_ESTIMATE
флаг, у вас все будет хорошо в этом случае.
Причина, по которой разработчики FFTW решили не дублировать эту функцию ради const
что в С, const
совсем не страшно, а FFTW — это библиотека C
Сначала подайте отчет об ошибке в библиотеку, затем const_cast
прочь постоянство &data.front()
, например const_cast<double*>(&data.front())