如何正确地将 std::vector< std::vector<double> > 转换为 void* 并将其重新解释回来?

How to properly cast std::vector< std::vector<double> > to void* and reinterpret it back?

我不是 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);

因此它适合来自 c++ 中 NLopt 包的 opt.set_min_objective(vfunc vf, void *f_data) 函数。

基于 ,我正在尝试以下但它不起作用:

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

任何帮助都会很棒。谢谢!

设置代码为:

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 数据类型声明来提高可读性。