Как правильно привести std :: vector <std :: vector <double>> к void * и переосмыслить его обратно? - PullRequest
1 голос
/ 13 апреля 2020

Я не эксперт в c ++, и у меня проблема с приведением std::vector< std::vector<double> > my_data к void *f_data и переосмыслением этого приведения.

В основном мне нужно преобразовать my_data:

std::vector<double> point1(2);
point1[0] = 0.06; point1[1] = 2.07;
std::vector<double> point2(2);
point2[0] = 1.01; point2[1] = 0.02;
std::vector< std::vector<double> > my_data;
my_data.push_back(point1);
my_data.push_back(point2);

, чтобы она соответствовала функции opt.set_min_objective(vfunc vf, void *f_data), поступающей из пакета NLopt в c ++.

На основании этого поста , я пытаюсь выполнить следующее но это не работает:

auto *test = static_cast<void*>(my_data.data());
std::vector< std::vector<double> > *this_data = reinterpret_cast<std::vector< std::vector<double> >*>(test);

, так как при отладке я получаю следующую ошибку:

this_data=Cannot access memory at address 0x3faeb851eb851eb8

Я также пробовал это, но это тоже не работает:

auto test = static_cast<void*>(my_data.data());
std::vector< std::vector<double> > *this_data = reinterpret_cast<std::vector< std::vector<double> >*>(test);

Любая помощь будет отличной. Спасибо!

1 Ответ

1 голос
/ 13 апреля 2020

Код установки будет:

opt.set_min_objective(vf, &my_data);

, а затем внутри функции vf для получения указателя на оригинал:

static_cast< std::vector<std::vector<double>>* >(f_data)

, который вы можете использовать для инициализации ссылка:

auto& my_data = *static_cast< std::vector<std::vector<double>>* >(f_data);

Читаемость может быть улучшена объявлением using для типа данных.

...