在c ++中设置任意类型的动态数组长度的通用方法

Ian*_*uss 1 c++ dynamic-data

我正在做一个将一些Pascal(Delphi)代码转换为C++的项目,并希望编写一个大致相当于Pascal"SetLength"方法的函数.这需要引用动态数组,以及长度并分配内存并返回引用.

在C++中,我正在思考一些类似的东西

void* setlength(void* pp, int array_size, int pointer_size, int target_size, ....) {
      void * p;
      // Code to allocate memory here via malloc/new
      // something like:   p = reinterpret_cast<typeid(pp)>(p); 
      //                   p=(target_size) malloc(array_size);
      return p;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有办法将指针类型传递给这样的函数并成功分配内存(可能通过typeid参数?)?我可以用吗

<reinterpret_cast>
Run Code Online (Sandbox Code Playgroud)

不知何故?在使用方面,最终目标如下:

float*** p;
p=setlength(100,sizeof(float***),sizeof(float**),.....);

class B;
B** cp;
cp=setlength(100,sizeof(B**),sizeof(B*),.....);
Run Code Online (Sandbox Code Playgroud)

任何帮助都是最受欢迎的.我知道我的建议代码是错的,但想传达一般的想法.谢谢.

jal*_*alf 5

使用std :: vector而不是原始数组.然后你可以简单地调用它的resize()成员方法.

并使该函数成为处理任意类型的模板:

如果你想使用你的功能,它可能看起来像这样:

template <typename T>
std::vector<T>& setlength(std::vector<T>& v, int new_size) {
      v.resize(new_size);
      return v;
}
Run Code Online (Sandbox Code Playgroud)

但是现在它很简单,你可能想完全消除这个功能而只是打电话resize来开始.

我不完全确定你在尝试用你的例子中的三重指针做什么,但看起来你不想调整大小,你想要初始化到一定的大小,这可以通过vector构造函数:

std::vector<float>v(100);
Run Code Online (Sandbox Code Playgroud)