Я наткнулся на большую структуру pod, в которую я хотел добавить std::vector
член.
struct LargePodStruct {
float x,y,z;
int *arr;
int sz;
... // dozens of primitive types
std::vector<int> the_new_vector;
};
Для того, чтобы добавить vector
к этой структуре, мне нужно было заменить все calloc()
экземпляры этой структуры с new
,
Кроме того, мне нужно создать экземпляр каждого существующего члена в ноль.
Тем не менее, добавление конструктора по умолчанию, который создает каждый элемент в ноль, является обычной задачей. Также легко забыть создать экземпляр нового участника в будущем.
LargePodStruct::LargePodStruct()
x(), y(), z(), arr(), sz(), ... // +dozens of instantiations
{}
Есть ли более простой способ создания экземпляров примитивных членов этой структуры с меньшими усилиями?
Есть хороший & элегантный способ обнуления члена профсоюза?
.
struct LargePodStruct {
float x,y,z;
int *arr;
int sz;
...
union {
int i;
void *ptr;
} u;
std::vector<int> the_new_vector;
};
Вы мог продолжать выделять необработанный блок памяти, используя calloc()
, а затем использовать Размещение новый построить структуру внутри этого блока памяти:
void *buffer = calloc(1, sizeof(LargePodStruct));
LargePodStruct *s = new(buffer) LargePodStruct;
Однако вы не сможете использовать delete
чтобы освободить структуру, вы должны вызвать ее деструктор напрямую, а затем free()
блок памяти:
s->~LargePodStruct();
free(buffer);
template<typename V>
struct zdf{
V value;
zdf():value{}{};
operator V&(){return value;};
operator V()const{return value;};
V operator()const{return value;};
V& operator(){return value};
};
struct LargeModernValue{
zdf<float> x,y,z;
std::vector<int> arr;
std::any u;/*std::variant<int,void*> u;*/
//....
std::vector<int> theNewVec;
};