如何从向量创建一个真正的数组



我有一个向量(字符串(,需要将其传递到只接受真数组(而不是指针(的函数中。

//Function only accepts arrays, not vectors or pointers
//It has to be an array so that the compiler can figure out N
template<typename T, typename U, size_t N>
T* createElementFromArray(U (&a)[N]){
return createElementFromArrayHelper<T>(std::make_index_sequence<N>{}, a);
}

问题是,我需要动态分配数组,使其与向量大小相同,但new[]只返回一个指针,而不是真正的数组。

如何动态分配一个真正的数组,而不是指针?或者有其他方法可以从数组中创建向量(数组需要与向量大小完全相同(?

根据这个答案中的代码,您从哪里获得CreateElementFromArray(),您想要的根本不可能。

CreateElementFromArray()在编译时将固定大小的N值数组转换为传递给T的构造函数的N参数序列。例如,这个代码来自同一个答案:

struct A {
A(int a, int b) : x(a), y(b) {}
int x, y;
};
int Aargs[] = { 1, 2 };
A* a = createElementFromArray<A>(Aargs);
delete a; 

由编译器翻译成以下代码:

struct A {
A(int a, int b) : x(a), y(b) {}
int x, y;
};
int Aargs[] = { 1, 2 };
A* a = new A(Aargs[0], Aargs[1]);
delete a; 

对于在运行时分配std::vector或其他动态数组,这种转换是不可能的

但是,如果T的构造函数接受向量/数组作为输入,则可以使用来自同一答案的createElement()

template<typename T, typename... TArgs>
T* createElement(TArgs&&... MArgs)

传递给createElement()的任何内容都会原样传递给T的构造函数。例如:

struct A {
A(int* values, size_t N) : values(values, values+N) {}
A(const vector<int> &values) : values(values) {}
vector<int> values;
};
vector<int> Aargs1 = { 1, 2 };
array<int, 3> Aargs2 = { 1, 2, 3 };
int* Aargs3 = new int[4]{ 1, 2, 3, 4 };
A* a = createElement<A>(Aargs1);
delete a;
a = createElement<A>(Aargs1.data(), Aargs1.size());
delete a;
a = createElement<A>(Aargs2.data(), Aargs2.size());
delete a;  
a = createElement<A>(Aargs3, 4);
delete a;
delete[] Aargs3;

最新更新